管道
管道的特质
- 本质是一个伪文件(实质是内核缓冲区)
- 由两个文件描述符引用, 一个表示读端, 一个表示写端
- 规定数据从管道的写端写入, 读端读出
其原理实则为内核使用环形队列机制, 借助内核缓冲区实现
局限性:
- 数据不能由一个进程同时读和写
- 不可反复读取管道中的数据, 一旦读走, 则管道将不存在
- 采用半双通讯的方式, 数据只能在单方向上流动
- 只能在有公共祖先的进程间使用管道
管道的用法
pipe
创建并打开管道
int pipe(int fd[2])
参数:
fd[0]: 读端
fd[1]: 写端
返回值:
成功: 0
失败: -1
总结
1. 读管道:
1. 若有数据, 则read返回实际读到的字节数
2. 若无数据
1. 若写端全部被关闭, 则read返回0
2. 若写端没有被全部关闭, 则read阻塞等待, 让出cpu
2. 写管道:
1. 读端全部被关闭, 进程异常终止(SIGPIPE)
2. 读端没有全部被关闭:
1. 管道已满, write阻塞
2. 管道未满, write将数据写入, 返回实际写入的字节数
fpathconf
long fpathconf(int fd, int name);
参数:
fd: 文件的描述符
name: 查询的参数
_PC_PIPE_BUF
_PC_NAME_MAX
_PC_LINK_MAX
_PC_MAX_INPUT
...
管道的优劣
优点:
1. 使用简单
缺点:
1. 只能单向通讯, 双向通讯需要建立两个管道
1. 只能用于父子, 兄弟进程间的通信
命名管道
mkfifo
int mkfifo(const char *pathname, mode_t mode);
参数:
pathname: 创建的路径(名字)
mode: 创建的权限
返回值:
成功: 0
失败: -1, 设置 errno
管道是Unix/Linux系统中的一种进程间通信机制,它通过内核缓冲区实现数据传递。管道分为匿名管道和命名管道,匿名管道主要用于父子进程或兄弟进程之间的单向通信,而命名管道(FIFO)允许不相关进程间通信。管道具有简单易用的特点,但存在数据单向流动、不可反复读取等限制。mkfifo函数用于创建命名管道,而pipe函数用于创建匿名管道。了解管道的使用和限制对于进程间通信至关重要。

被折叠的 条评论
为什么被折叠?



