从命名管道读取的 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 不会结束的主要内容,如果未能解决你的问题,请参考以下文章

从命名管道、C 程序(编写器)和 Python(读取器)获取额外数据

命名管道(C#)

C命名管道不适用于多进程

Java中的命名管道和多线程

如何写入命名管道而不等待读取管道

检测命名管道的关闭