FIFO的特点
- FIFO相比于匿名管道,一个最大的特点是,其可以不用像匿名管道一样,只能在拥有共同祖先的进程间通讯,而是可以在任意的进程间通讯。
- FIFO和匿名管道相比还有一个大的区别为:FIFO在文件系统中有名称,可以像普通文件一样操作。
- 其他大部分特点都和匿名管道一样,传输的数据都是流、半双工、对于数据小于PIPI_BUFSIZE的数据来说是原子性的、传输的大小也有限制。
- 默认为阻塞状态。默认下,使用open函数打开FIFO一段进行读(O_RDONLY),如果另一段写没有打开,那么读open会阻塞直到写open。相反一样。
- 对于read和write操作,其和匿名管道一样。
FIFO相关函数和命令
1.创建FIFO的函数:
#include <sys/stat.h>
int mkfifo(const char *pathname, mode_t mode);
参数说明:pathname为FIFO对于的文件路径,mode参数为文件的权限设置。如果函数创建成功返回0,创建失败-1.
2.创建FIFO命令
mkfifo [-m mode ] pathname
说明: -m选项用于指定权限。
3.查看文件是否是FIFO文件的方法
使用 ls -l命令可以看到FIFO文件的第一列为P,使用命令ls -P可以看到文件名后面会有一个|。
非阻塞模式
1.向前面介绍的一样,默认情况下,调用open函数进行读或写打开,如果另一端没有写或读打开,那么open操作会阻塞。因此可以在条用open的时候,指定O_NONBLOCK标识,来将其变为非阻塞的。eg:
open("path", O_RDONLY|O_NONBLOCK);
2.但是对于读或写的open,非阻塞方式结果有稍微不通。
- 如果另一端打开的情况下,对于读或写的open的非阻塞方式,都会立即成功。
- 如果另一端关闭的情况下,对于读,会立即成功,对于写,会返回失败(ENXIO)。
3.对于open的非阻塞方式主要有以下两个作用:
- 可以防止两个进程对于两个FIFO的打开的死锁。
- 可以让一个进程可以同时打开两端。
4.对于open的非阻塞标记O_NONBLOCK,其会对后面的read和write语义存在。如果需要在需要的时候将FIFO为非阻塞,在不需要的时候将FIFO改为阻塞,可以使用fcntl函数进行设置。