linux mkfifo c

#include <fcntl.h>
#include <stdio.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <unistd.h>

int c = 1;
int main() {
  int ret;
  char *myfifo = "/tmp/myfifosharefile";
  ret=mkfifo(myfifo, 0666);
  pid_t pid = fork();
  int fd;
  if (pid == 0) {
    char buf[4096];
    fd = open(myfifo, O_RDONLY);
    read(fd, buf, 4096);
    printf("received:%s\n", buf);
    close(fd);

  } else {
    fd = open(myfifo, O_WRONLY); 
    char *msg = "hi";
    write(fd, msg, sizeof(msg));
    printf("%d\n", c++);
    close(fd);
    unlink(myfifo);
    wait(NULL);
  }
}

这个使用过程中涉及 阻塞

进程间通信之fifo,在阻塞模式下,只有当读和写模式都打开时才返回,否则一直阻塞;

非阻塞模式下,当读端没打开,则打开写端无效,返回错误。

建议你读一读UNP卷2。

a. 不使用O_NONBLOCK标志时,只读open要阻塞到某个其它进程为写而打开它为止

b. 不使用O_NONBLOCK标志时,只写open要阻塞到某个其它进程为读而打开它为止
c. 如果在open的时候指定O_NONBLOCK标志,当只读open时,没有进程为写而打开FIFO的话,会返回-1,只写open时,没有进程为读而打开FIFO的话也会返回-1表示失败。

以上的情况使FIFO的使用带来了一些不便,但有一个常用的技巧是,只要用O_RDWR(读写)来打开一个管道,则不会返回失败,而open也不会阻塞。两个进程使用FIFO来进行通信时,通常会使用两个FIFO,一个用于发送数据(即进行写操作),一个用于接收数据(即进行读操作),而这两个FIFO需要均使用O_RDWR来打开。使用系统调用open, read, write来操作这两个FIFO没有什么问题,程序工作得很好。
————————————————
版权声明:本文为CSDN博主「Mr_John_Liang」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/liangzhao_jay/article/details/47108977