Linux系统编程之FIFO通信

FIFO通信

fifo: (有名管道) 应用于非血缘关系进程间(不能反复读取)

  • 用于非血缘关系进程间通信

  • 创建管道的伪文件:
    命令: mkfifo
    函数:int mkfifo(const char *pathname,mode_t mode);

  • 内核会针对fifo 文件开辟一个缓冲区,操作fifo文件,可以操作缓冲区,实现进程间通信—实际上就是文件读写

例如:

//04_fifo_w.c

#include<sstdio.h>
#include<unistd.h>
#include<sys/types.h>
#include<sys/stat.h>
#include<fcntl.h>
#include<string.h>

int main()
{
   if(argc!=2)
   {
      printf("./a.put fifoname\n");
      return -1;
   }
   //当前目录有一个myfifo文件
   //打开fifo文件‘
   printf("begin write...\n");
   int fd=open(argv[1],O_WRONLY);
   prinhtf("end write...\n");
   //写
   char buf[256];
   int num=1;
   while(1)
   {
     memset(buf,0x00,sizeof(buf));
     sprintf(buf,"xiaoming%04d",num++);
     write(fd,buf,strlen(buf));
     sleep(1);
     //循环写
  }
  //关闭描述符
  close(fd);
  return 0;
}

//04_fifo_r.c

#include<stdio.h>
#include<unistd.h>\
#include<sys/types.h>
#include<sys/stat.h>
#include<fcntl.h>
#include<cstrin,h>

int main()
{
  if(argc!=2)
  {
     printf("./a.out filename\n");
     return -1;
  }
   printf("begin read...\n");
  int fd=open(argv[1],O_RDONLY);
   prinhtf("end read...\n");
  char buf[256];
  while(1)
  {//循环读
      memset(buf,0x00,sizeof(buf));
      ret=read(fd,buf,sizeof(buf));
      if(ret>0)
      {
        printf("read:%s\n",buf);
      }
  }
  close(fd);
  return 0;
}

输出:先执行写,输出显示“begin write…” 执行完open函数后进程被阻塞了,一直到另外一个进程执行读,进程才会被释放

注意:

  • 调用open函数,打开FIFO 文件,只打开读,只打开写,会阻塞

  • 打开fifo文件的时候,read端会阻塞等待write端open,write端同理,也会阻塞等待另一端打开

  • man 7 fifo 查看FIFO 信息

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值