Linux进程间通信之FIFO

​管道(Pipe)是UNIX系统进程间通信的一种古老形式,所有类UNIX系统(Linux,Qnx等)都支持这种IPC机制。管道分为无名管道和命名管道(FIFO),它们都是半双工的通信方式,一个进程对管道进行写操作,另外一个进程对管道进行读操作。上次分享了无名管道的创建及使用,本文介绍一下FIFO的使用。

上次提到了无名管道只能用于具有亲缘关系的进程间的通信,比如父子进程之间或者父进程的两个子进程之间的通信,原因是无名管道创建的文件描述符并不指向文件系统,而是由内核缓冲区来实现,因此对没有亲缘关系的进程不可见。而命名管道(FIFO)则没有这种限制,不相关的进程之间也可以通过FIFO来进行数据交换。

FIFO是一种文件类型,创建FIFO类似于创建文件,FIFO的路径名存在于文件系统中。

​#include <sys/stat.h>
int mkfifo(const char *path, mode_t mode);
int mkfifoat(int fd, const char *path, mode_t mode);
/* 两个函数的返回值:成功返回0;出错返回-1 */

mkfifo函数中的mode参数与文件操作函数open的mode相同,mkfifoat和mkfifo功能相似,但是mkfifoat可以被用来在fd文件描述符表示的目录相关的位置创建一个FIFO。像其他*at函数一样,分3种情形:

  1. 如果path参数指定的是绝对路径,则fd参数会被忽略,此时mkfifoat的行为和mkfifo类似。
  2. 如果path参数指定的是相对路径,则fd参数是一个打开目录的有效文件描述符,路径名和目录有关。
  3. 如果path参数指定的是相对路径,并且fd参数有一个特殊值AT_FDCWD,则路径名以当前目录开始,mkfifoat和mkfifo类似。

当我们用mkfifo或者mkfifoat创建FIFO时,需要用open来打开它。当open一个FIFO时,非阻塞标志(O_NONBLOCK)会产生下列影响。

a) 在一般情况下(没有指定O_NONBLOCK),只读open要阻塞到某个其他进程为写而打开这个FIFO为止。类似的,只写open要阻塞到某个其他进程为读而打开它为止。
b) 如果指定了O_NONBLOCK,则只读open立即返回。但是,如果没有进程为读而打开一个FIFO,那么只写open将返回-1,并且errno被设置成ENXIO。

FIFO创建代码示例:

#include <stdio.h>
#include <stdlib.h>
#include <sys/stat.h>
#include <string.h>
#include <errno.h>
int main(int argc, char **argv)
{  
   if (argc < 2)   
   {    
     fprintf(stdout, "Usage: %s <filename>\n", argv[0]);    
     exit(1);  
   }
  //int mkfifo(const char *path, mode_t mode);  
  if (mkfifo(argv[1], 0644) < 0) /* 从命令行接收参数对FIFO命名 */  
  {    
    fprintf(stderr, "mkfifo() failed: %s\n", strerror(errno));    
    exit(1);  
   }  
   return 0;
}

欢迎关注微信公众号"汽车软件后花园",回复1025或者查看历史文章中的“Linux进程间通信之FIFO”,即可获取FIFO写入和读取代码示例。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值