3 c named-pipes systems-programming
在小孩,我写入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");
}
Run Code Online (Sandbox Code Playgroud)
情况就是如此,因为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");
}
Run Code Online (Sandbox Code Playgroud)
原因:read()在管,只有当最后一个文件描述符为写入打开被关闭,这是从来没有的情况下,返回EOF时从中读出也打开写文件描述符(O_RDWR)