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)