进程间通信
进程间通信的目的
- 数据传输:一个进程需要将它的数据发送给另一个进程;
- 资源共享:多个进程之间共享同样的资源。
- 通知事件:一个进程需要向另一个或一组进程发送消息,通知它(它们)发生了某种事件(如进程终止时要通知父进程)。
- 进程控制:有些进程希望完全控制另一个进程的执行(如Debug进程),此时控制进程希望能够拦截另一个进程的所有陷入和异常,并能够及时知道它的状态改变。
进程间通信方式
1.管道(数据传输)
- 匿名管道
- 命名管道
2.System V IPC
- 消息队列 (数据传输)
- 共享内存(数据共享)
- 信号量 (进程控制)
1.管道: 是一种半双工通信(一种可以选择方向的单向通信)
本质:操作系统在内核中创建的一块缓冲区(内存) ;
多个进程通过访问同一个缓冲区就可以实现通信。
管道的种类:匿名管道/命名管道
1. 匿名管道:内核中的缓冲区没有明确的标识,一个进程可以通过系统调用接口创建管道
int pipe(int pipefd[2]);
通过传入的参数向用户返回两个管道的操作句柄,其中pipefd[0]用于从管道读取数据,
其中pipefd[1]用于向管道写入数据
若创建管道之后创建了一个子进程,子进程通过复制父进程的方式,可以获取到管道的操作句柄。
特性:匿名管道只能用于具有亲缘关系的进程间通信。
读写特性:
1.若管道中没有数据,则read会阻塞;若管道中数据满了,则write会阻塞;
2.若管道所有写端被关闭,则read会读完管道中的数据后返回0 (没有数据的时候将不再阻塞);
3.若管道所有读端被关闭,则继续write会触发异常导致进程退出;
**2.**命名管道:有名字的管道—内核中的管道缓冲区有自己的标识符
可以用于同- -主机上的任意进程间通信命名管道的标识符:是一个可见于文件系统的特殊管道文件.
mkfifo创建一个命名管道
int