Linux系统编程-进程间通信-命名管道mkfifo

// fifo_w.c
#include<stdio.h>
#include<unistd.h>
#include<errno.h>
#include<stdlib.h>
#include<sys/types.h>
#include<string.h>
#include<sys/stat.h>
#include<fcntl.h>

/*
命名管道
不同于匿名管道,命名管道是可以在没有血缘关系的进程之间进行通信的,
它会与系统中的一个路径名进行关联,以文件的形式存在文件系统中,因此,
系统中的不同进程可以通过FIFO的路径名来访问文件,实现彼此之间的通信。

FIFO本质和匿名管道相同,都是由系统内核管理的一块缓存,对该文件进行读写不会改变
文件的大小(一般的读写操作会改变文件的大小,在此提醒)。FIFO与管道一样,
当缓冲区为空或缓冲区满时,会产生阻塞。
*/
int main(int argc, char* argv[]){
  // 判断是否传入文件名
  if (argc< 2) { 
      printf("please input file name\n");
      exit(1);
  }
  // 判断 fifo 文件是否存在
  int ret = access(argv[1], F_OK);
  if (ret == -1){
      // 如果 fifo 不存在就创建 fifo  0644 0 不用管 644 6=4+2+1 4 1 <-- 4 read 2 write 1 create
      int r = mkfifo(argv[1], 0664);
      if (r== -1){
         perror("mkfifo error");
         exit(1);
      } else{
         printf("fifo creat success!\n"); 
      }
  }
  // 以上的操作都是为了创建 fifo 文件,文件名称是传递通过main 函数参数传进来的 ./demo mkfifo
  int fd = open(argv[1], O_WRONLY);
  while (1)
  {
    char* p = "hello world";
    write(fd, p, strlen(p)+1);
    sleep(1);
  }
  close(fd);
  return 0;
}
// fifo_r.c
#include<stdio.h>
#include<unistd.h>
#include<errno.h>
#include<stdlib.h>
#include<sys/types.h>
#include<sys/stat.h>
#include<string.h>
#include<fcntl.h>


int main(int argc, char* argv[]){
  // 判断是否传入文件名
  if (argc< 2) { 
      printf("please input file name\n");
      exit(1);
  }
  // 判断 fifo 文件是否存在
  int ret = access(argv[1], F_OK);
  if (ret == -1){
      // 如果 fifo 不存在就创建 fifo  0644 0 不用管 644 6=4+2+1 4 1 <-- 4 read 2 write 1 create
      int r = mkfifo(argv[1], 0664);
      if (r== -1){
         perror("mkfifo error");
         exit(1);
      } else{
         printf("fifo creat success!\n"); 
      }
  }
  // 打开文件
  int fd = open(argv[1], O_RDONLY);
  if (fd ==-1) {
      perror("open error");
      exit(1);
  }
  while (1){  
     char buff[1024];
     // 不断读取 fifo 文件的内容,并打印出来
     read(fd, buff, sizeof(buff)); 
     printf("buf=%s\n", buff); 
  }
  close(fd);
  return 0;
}

输出如下:

zfz:Demo zhangfengzhou$ gcc fifo_write.c -o fifo_write
zfz:Demo zhangfengzhou$ gcc fifo_read.c -o fifo_read
zfz:Demo zhangfengzhou$ ./fifo_write mkfifo
fifo creat success!
zfz:Demo zhangfengzhou$ ./fifo_read mkfifo
buf=hello world
buf=hello world
buf=hello world
buf=hello world
buf=hello world
....

参考:

1. 《Linux编程基础》-黑马程序员

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值