无法从多个 fifos 读取

标签 c linux named-pipes

我在尝试读取多个 fifo 时遇到了一个非常烦人的问题。我有 1 个等待来自 fifo 的结构的进程和几个向他发送信号结构的进程。第一次阅读后,我无法再从任何信号中读取任何内容。看起来程序卡住了。

发送进程在main中有这个

myfifo = '/tmp/myfifo{0}' //{0} is a number that every process has individual.
mkfifo(myfifo, 0666);
fd = open(myfifo, O_WRONLY);
write(fd, &demon1 , sizeof(demon1));
close(fd);
while (1)
{
}

这在 signal_handler 中

void signal_handler(int signum)
{
    if (signum == SIGUSR1)
    {
        //some declarations here
        mkfifo(myfifo, 0666);
        fd = open(myfifo, O_WRONLY | O_NONBLOCK);
        write(fd, &demon1 , sizeof(demon1));
    }
}

虽然阅读过程有

myfifo[i] = /tmp/myfifo{0} // {0} is i which is the number of process that sends.

 while(1)
 {
    for(i=0;i<n;i++)
    {
       fd = open(myfifo[i], O_RDONLY | O_NONBLOCK);
       r = read(fd, &demon1, sizeof(demon1));
       if(r > 1)
       {
           //printf struct elements
       }

    }
  }

最佳答案

您打开循环内的管道。这样,您很快就会用完文件描述符(如果您检查 open() 的结果是否有错误,就会看到)。

我建议在循环外打开所有 FIFO,将文件描述符存储在一个数组中,然后只读取它们中的每一个,但是……读取会阻塞。查看 select(2) 找出哪个 FIFO 有数据。

另一种解决方案是单个 FIFO,写入过程应在消息中发送它的 ID。这样,主进程只需要监听一个 FIFO。如果它想知道是谁发的消息,它可以查看消息中的 ID。这里的问题是:您需要某种锁定,否则多个进程将同时写入 FIFO,它们的数据可能会混淆(这取决于 FIFO 缓冲区)。

关于无法从多个 fifos 读取,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34746720/

相关文章:

ruby - 是否可以使用与 awk 类似的语法使用索引和子字符串命令将此代码转换为 ruby​​?

Linux DB2 服务器表现出极端负载

c - 命名管道窗口的行为

c - 通过函数传递的指针和结构

c - 在 opencv 中训练神经网络时出错

c++ - 来自 2 个指针的组合缓冲区,无需复制

c - 选择系统调用不扫描超过 2 个描述符

c# - 与 Windows 命名管道 (.Net) 的异步双向通信

c# - WCF - 最快的进程间通信

python - 将.c文件重命名为.cpp,导入Cython库失败