从命名管道读取的C不会结束

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)

Ctx*_*Ctx 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");
}
Run Code Online (Sandbox Code Playgroud)

原因:read()在管,只有当最后一个文件描述符为写入打开被关闭,这是从来没有的情况下,返回EOF时从中读出也打开写文件描述符(O_RDWR)