【发布时间】:2017-06-20 02:35:49
【问题描述】:
据我了解,根据https://linux.die.net/man/3/mkfifo,
我得到一个暗示,我必须有读写器文件,以便
利用管道文件。下面的源码是writer文件,
#include <fcntl.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <unistd.h>
#include <stdio.h>
#include <unistd.h>
int main(){
int fd;
char *myfifo = "./myfifo";
mkfifo(myfifo, 0777);
fd = open(myfifo, O_WRONLY);
int PID = fork();
if(PID == 0){
execl("./reader.o", "reader", (char*)NULL);
}
write(fd, "Rock and roll baby\0", sizeof("Rock and roll baby"));
close(fd);
unlink(myfifo);
return 0;
}
下面提供的来源是阅读器文件。
#include <fcntl.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
#define MAX_BUF 1024
int main(){
int fd;
char* myfifo = "./myfifo";
char buf[MAX_BUF];
fd = open(myfifo, O_RDONLY);
read(fd, buf, MAX_BUF);
write(STDOUT_FILENO, buf, MAX_BUF);
close(fd);
exit(EXIT_SUCCESS);
return 0;
}
当运行编写器文件的可执行文件时,命令提示符进入
在打印换行符后停止。我对这个问题的假设是因为
编写器文件中的open() 无法检测到管道文件,
是这样吗?
谢谢。
【问题讨论】:
-
除非您对
open()的参数进行欺骗,否则读取器和写入器都不会从open()调用返回,直到有另一个进程打开了FIFO 的“另一端”。也就是说,读者等到有写者,写者等到有读者。因此,您需要在尝试打开 FIFO 之前 fork 并执行子进程。这也解决了另一个问题——你应该在执行子进程之前关闭 FIFO 的写端。子进程会挂起,因为它有一个用于 FIFO 的写入文件描述符和一个读取文件描述符;没有 EOF。