匿名管道
只适合具有父子关系的进程之间的通信;
匿名管道的创建需要通过pipe()系统调用实现
int pipe(int fd[2]);
调用pipe()会通过fd传给用户程序两个文件描述符,fd[1]表示管道写入端描述符,fd[0]表示管道读出端的描述符;
通信的数据是放在内核缓冲区的,也就是内存,因此会有大小的限制;但是数据格式不会进行限制;
由于父子进程都可以对管道进行读写,为了避免这种情况的发生,我们做以下操作:
- 父进程关闭读取的fd[0],只保留写入的fd[1]
- 子进程关闭写入的fd[1],只保留读取的fd[0]
人为的规定了管道的通信是单向的,因此父子进程互相通信需要两个通道;
命名管道(FIFO)
命名管道可以在不相关的进程之间能互相通信;
命名管道需要提前创建一个类型为管道的设备文件,在进程里只要使用这个设备文件,就可以相互通信,遵循先进先出原则。
命名管道内核实现时可以支持双向通信;
Unix中的FIFO类似管道,是一个单向(半双工)的数据流。