c - 打开 FIFO 进行写入返回 "No such device or address"

标签 c select fifo named

我想创建一个服务器进程和一个客户端进程 - 用于可选的类分配 - 并使它们相互通信。教授告诉我们:

1)我们必须使用O_NONBLOCK

2)我们必须创建2个FIFO,一个只读,一个只写

3)我们不能使用套接字

因此,我在服务器进程中创建了 2 个 FIFO,并尝试打开它们,但打开错误返回“没有这样的设备或地址”。

服务器进程:

......

if( mkfifo("fifo1", PERMS) < 0 && errno != EEXIST)
{
    perror("can't create FIFO (read)");
    exit(EXIT_FAILURE);
}
if( mkfifo("fifo2", PERMS) < 0 && errno != EEXIST )
{
    perror("can't create FIFO (write)");
    exit(EXIT_FAILURE);
}

if( (readfd = open("fifo1", O_RDONLY | O_NONBLOCK)) < 0)
{
    perror("console: can't open read FIFO");
    exit(EXIT_FAILURE);
}
if( (writefd = open("fifo2", O_WRONLY | O_NONBLOCK)) < 0)
{
    perror("coord: can't open write FIFO");
    exit(EXIT_FAILURE);
}

客户端流程:

.....

if( (readfd = open("fifo2", O_RDONLY | O_NONBLOCK)) < 0)
{
    perror("console: can't open read FIFO");
    exit(EXIT_FAILURE);
}
if( (writefd = open("fifo1", O_WRONLY | O_NONBLOCK)) < 0)
{
    perror("console: can't open write FIFO");
    exit(EXIT_FAILURE);
}

while( fgets(buffer, 100, stdin) )  //char buffer[100];
{
    n = strlen(buffer);
    w = write(writefd, buffer, n);

    memset(buffer, 0, 100);
}

我在网上寻找解决方案,结果发现this答案,它很好地解释了出了什么问题,但没有提出解决问题的方法。我再次上​​网查找,发现 select() ,看起来它可以提供一个解决方案,但我在理解它到底是如何工作的方面遇到了一些困难。

是否可以使用select()来解决此问题?

最佳答案

一个简单的解决方案是打开 fifo以阻塞模式进行写入(它将阻塞直到另一端打开进行读取),然后将其设置为非阻塞:

    writefd = open(fifo_name, O_WRONLY);
    fcntl(writefd, F_SETFL, O_NONBLOCK);

PS:我强烈建议不要忙着等待。

关于c - 打开 FIFO 进行写入返回 "No such device or address",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43402013/

相关文章:

java - poll() 返回类型与 PriorityBlockingQueue.poll() 冲突

c# - MassTransit、RabbitMQ - FIFO 出队支持

C 中结构体链表转换为 FIFO

c - syscall读写是否适用于System V消息队列发送和接收消息

c - 取消引用指向结构成员的不完整类型错误的指针

Oracle,从具有多行的子查询插入多行

mysql - 获取行长度最大的数据,MYSQL

c++ - 使 GUI 从 Windows 命令行运行

C ABI : is changing a void function to return an int a breaking change?

c++ - 如何在一次只允许 1 个选定项目的 ListView 中选择一个项目