从命名管道读取的 C 不会结束
Posted
技术标签:
【中文标题】从命名管道读取的 C 不会结束【英文标题】:C read from named pipe doesn't end 【发布时间】:2016-04-07 10:23:46 【问题描述】:在孩子中,我写信给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");
【问题讨论】:
【参考方案1】:是这种情况,因为文件描述符仍然是为写入而打开的,因为您使用 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强>)
【讨论】:
以上是关于从命名管道读取的 C 不会结束的主要内容,如果未能解决你的问题,请参考以下文章