Linux进程间通讯(IPC)------FIFO

本文介绍了FIFO相较于匿名管道的主要特点,包括能够在任意进程间通信、具备文件系统中的名称等,并详细解析了FIFO的创建方法及其非阻塞模式的使用技巧。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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函数进行设置。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值