有名管道
- 因为匿名管道只能用于有亲缘关系间的进程通信,所以为了没有亲缘关系之间的进程通信,提出了有名管道
- 有名管道(FIFO)提供了一个路径名与之关联,并以FIFO的文件形式存放在文件系统中,打开方式和普通文件一样。这样进程之间只需要访问该路径,就可以彼此通过FIFO通信。
- 一旦打开FIFO,就可以使用与匿名管道和其他文件的系统调用一样的IO系统调用
- 先入先出,和匿名管道一样
有名管道和匿名管道区别
- FIFO在文件系统中作为一个特殊文件存在,但FIFO中的内容却存在内存中
- 当使用FIFO进程退出后,FIFO文件将继续保留在文件系统中
- FIFO有名字,不相关的进程可以通过打开有名管道进行通信
有名管道的使用
1、通过命令创建
mkfifo 名字
2、通过函数创建有名管道
int mkfifo(const char* pathname,mode_t mode)
#include <sys/types.h>
#include <sys/stat.h>
int mkfifo(const char *pathname, mode_t mode);
参数:
pathname:管道名称的路径
mode:文件的权限,和open的mode一样
返回值:
成功:0
失败: -1 并设置错误号
3、一旦使用mkfifo创建,就可以使用open打开,常见的文件IO函数都可以操作fifo文件
4、FIFO的读总是从开始处返回数据,对他们的写则是把数据的末尾开始添加
有名管道注意事项
- 只读进程打开管道后,如果没有写进程存在,只读进程会被阻塞
- 只写进程打开管道后,如果没有读进程存在,只写进程会被阻塞
- 读管道
- 管道中有数据 read返回实际读到的字节数
- 管道中无数据
- 管道写端被全部关闭,read返回0,相当于读到文件末尾
- 写端没有全部被关闭,read阻塞等待
- 写管道
- 管道读端被全部关闭,写管道进程终止
- 管道读端没有被全部关闭
- 管道已满,write阻塞
- 管道未满,写入数据,并返回实际写入的字节数