gpt4 book ai didi

无法从多个 fifos 读取

转载 作者:太空宇宙 更新时间:2023-11-04 08:17:59 24 4
gpt4 key购买 nike

我在尝试读取多个 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com