现在的位置: 首页 > 操作系统 > 正文

Linux 进程通信如何实现FIFO

2020年02月13日 操作系统 ⁄ 共 1590字 ⁄ 字号 评论关闭

  FIFO 有名管道,实现无血缘关系进程通信。

  创建一个管道的伪文件

  a.mkfifo testfifo 命令创建;

  b.也可以使用函数int mkfifo(const char *pathname, mode_t mode);

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

  man 3 mkfifo

  #include #include int mkfifo(const char *pathname, mode_t mode);

  注意事项:

  FIFOs

  Opening the read or write end of a FIFO blocks until the other end is also opened (by another process or thread). See

  fifo(7) for further details.

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

  代码示例:

  file_w.c 写端

  #include < stdio.h>

  #include < stdlib.h>

  #include < sys/wait.h>

  #include < sys/types.h>

  #include < sys/stat.h>

  #include < unistd.h>

  #include < fcntl.h>

  #include < string.h>

  int main(int argc, char *argv[]) {

  if(argc != 2) {

  printf("./a.out filename1\n");

  return -1;

  }

  printf("begin open w\n");

  int o_ret = open(argv[1], O_WRONLY);

  printf("end open w\n");

  char buf[256];

  int num = 0;

  while (1) {

  memset(buf, '\0', sizeof(buf));

  sprintf(buf, "xiaoming--%d", num++);

  printf("strlen(buf) = %d\n", strlen(buf));

  write(o_ret, buf, strlen(buf));

  sleep(1);

  }

  close(o_ret);

  return 0;

  }

  file_r.c 读端

  #include < stdio.h>

  #include < stdlib.h>

  #include < sys/wait.h>

  #include < sys/types.h>

  #include < sys/stat.h>

  #include < unistd.h>

  #include < fcntl.h>

  #include < string.h>

  int main(int argc, char *argv[]) {

  if(argc != 2) {

  printf("./a.out filename1\n");

  return -1;

  }

  printf("begin open r\n");

  int o_ret = open(argv[1], O_RDONLY);

  printf("end open r\n");

  char buf[256];

  int num = 0;

  while (1) {

  memset(buf, '\0', sizeof(buf));

  read(o_ret, buf, sizeof(buf));

  printf("strlen(buf) = %d\n", strlen(buf));

  printf("read is%s\n", buf);

  }

  close(o_ret);

  return 0;

  }

  以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

抱歉!评论已关闭.