C 从命名管道读取不会结束
C read from named pipe doesn't end
在child中写入fifo"sample",在parent中读取。在下面的代码中,parent 写入终端 "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");
}
是这种情况,因为文件描述符仍处于写入状态,因为您使用 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()
只有 returns EOF 当最后一个为写入而打开的文件描述符关闭时,当您从中读取的文件描述符也为写作 (O_RDWR)
在child中写入fifo"sample",在parent中读取。在下面的代码中,parent 写入终端 "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");
}
是这种情况,因为文件描述符仍处于写入状态,因为您使用 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()
只有 returns EOF 当最后一个为写入而打开的文件描述符关闭时,当您从中读取的文件描述符也为写作 (O_RDWR)