【问题标题】:Is it possible to use epoll to write fifo/pipe data to multiple reader in one thread?是否可以使用 epoll 在一个线程中将 fifo/pipe 数据写入多个读取器?
【发布时间】:2021-06-27 15:00:10
【问题描述】:

有一个发布者通过许多不同的 fifos/管道将数据写入我程序中的其他客户端。

我知道如果我打开一个带有非阻塞标志的fifo来写入,打开会返回一个No such address or device错误。

如果我删除非阻塞标志,打开将被阻塞,所以只能使用一个管道。我该如何解决这个问题?

这是一个相关的 URL,When I try to open a fifo O_WRONLY I get a "No such device or address" error。但是那里没有答案。

【问题讨论】:

  • @shawn 是的,你是对的。但在我的程序中,客户端/阅读器并不总是准备好,他们可能随时打开阅读端。但我的出版商不想检查状态(阅读结束已打开)。是否有任何打开读取结束的通知?非常感谢。

标签: linux pipe fifo epoll


【解决方案1】:

我相信解决您的问题的唯一方法是包含一个基于计时器的轮询循环,您可以在其中尝试每秒左右打开每个 FIFO 一次。使那部分成为您的 select/poll/epoll 循环。一旦它们全部打开,您就可以停止这样做。

【讨论】:

  • 谢谢。我同意你的看法。也许这个问题没有答案。
【解决方案2】:

epoll 只适用于文件描述符,在成功打开之前你不会有文件描述符。您可以通过首先打开 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[])
{
  int fdread;
  char *fifoname = "my_fifo";
  mkfifo(fifoname, 0666);

  if ((fdread = open(fifoname, O_RDONLY | O_NONBLOCK)) == -1) {
    perror("open read only");
    exit(EXIT_FAILURE);
  }

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

  close(fd);
  close(fdread);
  printf("everything is fine\n");
  exit(EXIT_SUCCESS);
}

这解决了眼前的问题,但可能适用于您的设计的其余部分,也可能不适用。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-07-17
    • 1970-01-01
    • 1970-01-01
    • 2012-02-25
    • 1970-01-01
    • 2016-02-24
    • 2015-12-01
    相关资源
    最近更新 更多