进程间通信(IPC,InterProcess Communication)是指在不同进程之间传播或交换信息。
IPC 对象的持续性分为三种:随进程,随内核和随文件系统
- 随进程持续的 IPC 对象:一直存在到打开着 IPC 对象的最后一个进程关闭该对象为止,管道、FIFO 随进程
- 随内核持续的 IPC 对象:一直存在到内核重新自举或者显示删除 IPC 对象为止,Posix 消息队列随内核
- 随文件系统:一直存在到显示删除IPC对象为止
1. 管道
管道分为 PIPE(无名管道)和 FIFO(命名管道)两种,除了建立、打开、删除的方式不同外,这两种管道几乎是一样的。他们都是通过内核缓冲区实现数据传输。
PIPE 用于相关进程之间的通信,例如父进程和子进程,它通过 pipe() 系统调用来创建并打开,当最后一个使用它的进程关闭对他的引用时,PIPE 将自动撤销。
- 管道是半双工的,数据只能向一个方向流动;需要双方通信时,需要建立起两个管道;
- 匿名管道只能用于父子进程或者兄弟进程之间(具有亲缘关系的进程);
- 单独构成一种独立的文件系统:管道对于管道两端的进程而言,就是一个文件,但它不是普通的文件,它不属于某种文件系统,而是自立门户,单独构成一种文件系统,并且只存在与内存中。
FIFO 即命名管道,在磁盘上有对应的节点,但没有数据块——换言之,只是拥有一个名字和相应的访问权限,通过 mknode() 系