进程间通信概述
- 数据传输:一个进程需要将它的数据发送给另一个进程,发送的数据量在一个字节到几兆字节之间
- 共享数据:多个进程想要操作共享数据,一个进程对共享数据的修改,别的进程应该立刻看到。
- 通知时间:一个进程需要向另一个或一组进程发送消息,通知他们发生了某些事件(如进程终止时要通知父进程)
- 资源共享:多个进程之间共享同样的资源,为了做到这一点,需要内核提供锁和同步机制
- 进程控制:有些进程希望完全控制另一个进程的执行(如Debug进程),此时控制进程希望能够拦截另一个进程的所有陷入的异常,并能够及时指导它的状态改变。
进程间通信方式
- 管道(pipe),有名管道(FIFO)
- 信号(signal)
- 消息队列
- 共享内存
- 信号量
- 套接字(socket)
管道
- 管道针对本地计算机的两个进程之间的通信而设计的通信方式,管道建立后,实际获得两个文件描述符:一个用于读取另一个用于写入。
- 常见的IPC机制,通过pipe系统调用。
- 管道单工,数据只能向一个方向流动。双向通信时,需要建立两个管道。
- 数据的读出和写入:一个进程向管道中写的内容被管道另一端的进程读出。写入的内容每次都添加在管道的缓冲区的尾部,每次都是从缓冲区的头部读出数据。
管道的分类
- 匿名管道
- 关系进程,父子或兄弟
- 由pipe系统调用,管道由父进程建立
- 管道位于内核空间,其实是一块缓存
- 有名管道(FIFO)
- 两个没有任何关系的进程之间通信可通过有名管道进行数据传输
- 通过系统调用mkfifo创建
管道创建
#include<unistd.h>
int pipe(int fd[2]);
//返回:0成功,-1出错
- 两个文件描述符数组
- fd[0]:pipe的读端
- fd[1]:pipe的写端