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