半双工管道:
单向通信 ,shell 中 管道用 | 表示
$ ls -l|grep *.c //把 ls -l 的输出当做 "grep *.c" 的输入
进程创建管道, 每次创建两个文件描述符来操作管道,成功返回 0 ,失败返回 -1
int pipe(int filedes[2]);
局限性:
- 它是半双工的,即数据一个管道上的数据只能在一个方向上流动,如果要实现双向通信,就必须在两个进程之间建立两个管道;
- 管道只能在具有公共祖先的两个进程之间使用;
pipe的实现机制:
管道是由内核管理的一个缓冲区,它的一端连接一个进程的输出,另一端连接一个进程的输入。管道的缓冲区不需要很大,它被设计为环形的数据结构,当两个进程都终止后,管道的生命周期也会被结束。
管道是一个固定大小的缓冲区,在Linux中,该缓冲区的大小为一页,即4kb,使它的大小不会像普通文件那样不加检验的增长。在Linux中,内核使用struct pipe_inode_info结构体来描述一个管道,这个结构体定义在pipe_fs_i.h中。
原子性:
当要写入的数据量不大于PIPE_BUF时,linux将保证写入的原子性。
当要写入的数据量大于PIPE_BUF时,linux将不再保证写入的原子性。
--------------------------------------------分割线--------------
命名管道
1.创建 FIFO
shell 下创建
$ mkfifo /ipc/namedfifo
c语言
#include<sys/types.h>
#include<sys/stat.h>
int mkfifo(const char *pathname, mode_t mode);