管道分类
- 匿名管道
- 命名管道
匿名管道
原理:
- 匿名管道其本质就是内核缓冲区(内核所划分的一片内存),磁盘上不存在对应的文件;
- 其大小一般为4K;
- 其实现时使用一个环形队列。
特点:
- 管道具有阻塞的性质。
- 半双工的通信方式。
- 适用于亲缘进程间。
管道操作
- 使用
pipe(int pipefd[2])
函数, 0读1写。 - 读操作
- 有数据的情况下:
read()
函数正常读,返回读出的字节数。
- 无数据的情况下:
- 写端全部关闭,
read()
解除阻塞返回0,相当于读文件达到末尾 - 没有全部关闭,
read()
陷入阻塞。
- 写端全部关闭,
- 有数据的情况下:
- 写操作
- 读端全部关闭
- 管道破裂,进程被终止,内核给当前进程发
SIGPIPE
信号。
- 管道破裂,进程被终止,内核给当前进程发
- 读端没有全部关闭
- 缓冲区写满了,
write()
阻塞。 - 缓冲区没有写满,
write()
继续写。
- 缓冲区写满了,
- 读端全部关闭
查看缓冲区大小
使用
ulimit -a
命令
使用pathconf()
函数
命名管道
原理:
- 在磁盘上产生一个对应的文件,映射到内核缓冲区中。(任何写进磁盘上的
pipename
,均传到内核缓冲区中去,pipename
的大小适中为0); - fifo实际上是一个伪文件。
特点:
- 适用于非亲缘进程(两个无关的进程)。
- 具有阻塞性质。
- 半双工的通信方式。
操作方式:
- 可以使用I/O函数对文件进行操作。
read()/write()
open()/close()
- 不可使用
lseek()
操作。
创建方式。
mkfifo
命令;mkfifo()
函数。
关闭管道时,要注意管道的文件描述符被连接的数量,防止没有全部关闭,占用系统资源。