1、概述
1.进程间通信概述
- 进程间空间是独立的,包含文本段、数据段和系统数据段,进程是操作系统的最小操作单元
- 在 Linux 中,可以使用Linux内核实现多个进程间的通信
2.进程间通信常用的方式
- 传统 Unix 系统中的通信方式:管道、信号
- SYS V分支中的通信方式:消息队列、共享内存、信号灯
- BSD 分支中的通信方式:本地域套接字
2、管道
1.分类
- 有名管道:可以用于任意进程间通信
- 无名管道:只能用于父子进程间通信
2.无名管道
概述
- 无名管道是一段内核缓存区
函数接口
pipe
原型:
int pipe(int pipefd[2]);
功能:
创建一个无名管道(内核缓存区)
参数:
pipefd[0]:读管道文件描述符
pipefd[1]:写管道文件描述符
注:只有该父进程的子进程才能继承得到这两个文件描述符实现通信
返回值:
成功返回0 失败返回-1
管道操作特性
类型 | 读取数据结果 | 写入数据结果 |
至少有一个写端 | 如果管道中有数据则直接读出 | 如果管道中没有数据则阻塞等待有数据写入才能读出 |
没有写端 | 管道中有数据则直接读出 | 管道中没有数据不阻塞等待直接向下执行 |
至少有一个读端 | 如果管道没有写满则直接写入 | 如果管道存满则阻塞等待有数据读出才能继续写入 |
没有读端 | -- | 会产生管道破裂的信号导致进程任务异常退出 |
3.有名管道
概述
- 有名管道有名字,可以通过名字找到该管道
- 有名管道是进程间通信最简单、易实现的方法,可以用于任意进程间的通信
- 有名管道必须读写两端同时加入才能继续向下执行
- 两个进程可以通过向管道文件中读写数据实现进程的通信
函数接口
mkfifo
原型:
int mkfifo(const char *pathname, mode_t mode);
功能:
创建有名管道
参数:
pathname:管道文件名
mode:权限
返回值:
成功返回0 失败返回-1
3、信号
1.概述
- Linux系统中的信号主要实现应用层和内核层之间的信号通知
- 信号主要用于多个进程任务间的事件通知
- 信号可以用户异步通信
2.常见的信号类型
信号名 | 功能 | 信号名 | 功能 |
SIGINT | 终止信号 | SIGALARM | 定时时间到达信号 |
SIGQUIT | 退出信号 | SIGCHLD | 子进程结束,父进程接收到的信号 |
SIGKILL | 杀死进程信号 | SIGCONT | 继续执行进程任务 |
SIGSEGV | 段错误信号 | SIGSTOP | 停止进程任务 |
SIGPIPE | 管道破裂信号 | SIGTSTP | 挂起信号 |
SIGIO | 异步IO信号 | SIFGUSR | 用户自定义信号 |
3.信号处理方式
- 缺省:信号到达按默认方式处理
- 忽略:信号到达时不处理信号,忽略信号
- 捕捉:信号到达时按用户定义的方式处理
注:9号信号(SIGKILL)和19号信号(SIGSTOP)不能被忽略和捕捉
4.函数接口
signal
原型:
typedef void (*sighandler_t)(int); sighandler_t signal(int signum, sighandler_t handler); 功能:
设置signum对应信号的处理方式
参数:
signum:信号的编号
handler:信号的处理方式
SIG_IGN:忽略信号
SIG_DFL:缺省处理信号
返回值:
成功返回之前处理信号的方式
失败返回SIG_ERR
alarm
原型:
unsigned int alarm(unsigned int seconds);
功能:
设置第一个定时,过seconds秒后,给进程发送SIGALRM信号
参数:
seconds:秒数
返回值:
成功返回上次定时剩余的秒数
如果之前没有定时返回0
kill
原型:
int kill(pid_t pid, int sig);
功能:
给pid对应的进程发送sig信号
参数:
pid:进程的ID号
sig:信号的编号
返回值:
成功返回0 失败返回-1