#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