当我尝试打开一个FIFO O_WRONLY时,会出现“没有这样的设备或地址”的错误。

12

在我的代码中,我创建了一个名为"my_fifo"的FIFO,如果我以O_WRONLY | O_NONBLOCK模式打开它,open()会返回-1和错误号"No such device or address"。另一方面,如果我以O_RDONLY | O_NONBLOCK模式打开FIFO,则可以正常工作。这是为什么?我做错了什么吗?

#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>

int main(int argc, char *argv[])
{

    char *fifoname = "my_fifo";
    mkfifo(fifoname, 0666);

    int fd;
    if ((fd = open(fifoname, O_WRONLY | O_NONBLOCK)) == -1)
    {
        perror("open pipe");
        exit(EXIT_FAILURE);
    }

    close(fd);

    exit(EXIT_SUCCESS);
}
1个回答

16

查看Linux的fifo手册:

进程可以以非阻塞模式打开FIFO。 在这种情况下,只读方式打开将成功,即使尚未在写端打开,而只写方式打开将失败并显示ENXIO(没有这样的设备或地址),除非另一端已经打开。

如果想要非阻塞模式,则需要确保读取器在写入器之前打开FIFO。


2
谢谢你的回答!我仍然想知道为什么必须先打开只读。 - presa

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接