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

时间:2016-04-07 10:23:46

标签: 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");
}   

1 个答案:

答案 0 :(得分: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");
}

原因:当最后一个用于写入的文件描述符被关闭时,管道上的read()仅返回EOF,当您从中读取的文件描述符也被打开以进行写入时,情况绝对不是这样( O_RDWR