在孩子,我写信给fifo"样本"并在父母中阅读。在下面的代码中,父写入终端" sample"并等待,它不会退出读取功能。
pid_t p;
int fd;
char str[]="sample";
char ch;
mkfifo("myfifo", FIFO_PERMS);
fd = open("myfifo", O_RDWR);
p=fork();
if(!p){
printf("write %d byte\n", write(fd, str, 6));
}
else{
wait(NULL);
while(read(fd, &ch, 1)>0)
write(STDOUT_FILENO, &ch, 1);
close(fd);
unlink("myfifo");
}
答案 0 :(得分:6)
就是这种情况,因为filedescriptor仍然可以写入,因为你用O_RDWR打开它并与两个进程共享它。您必须确保文件描述符仅在读取过程中打开时打开,例如:
pid_t p;
char str[]="sample";
char ch;
mkfifo("myfifo", FIFO_PERMS);
p=fork();
if(!p){
int fd = open("myfifo", O_WRONLY);
printf("write %d byte\n", write(fd, str, 6));
}
else{
int fd = open("myfifo", O_RDONLY);
wait(NULL);
while(read(fd, &ch, 1)>0)
write(STDOUT_FILENO, &ch, 1);
close(fd);
unlink("myfifo");
}
原因:当最后一个用于写入的文件描述符被关闭时,管道上的read()
仅返回EOF,当您从中读取的文件描述符也被打开以进行写入时,情况绝对不是这样( O_RDWR 强>)