假设我在Linux系统上创建了一个命名管道:
我曾希望使用
我能想到的唯一其他解决方案是使用
是否有更好的解决方案?
编辑:我这里的进程在打开命名管道时会阻塞。然而,如果您使用
然而,这仍然具有实现
$ mkfifo my_pipe
接下来我想编写一个小型监控程序,该程序尝试从my_pipe
中进行read()
操作,但在一段时间后会超时。在以下伪代码中,我使用了一个虚构的函数wait_for_avail(fd, timeout_ms)
:
int fd = open("my_pipe", O_RDONLY);
while (1) {
//Fictional wait_for_avail(fd, timeout_ms). Is there a real function
//that has this behaviour?
int rc = wait_for_avail(fd, 500);
if (rc == 1) {
char buf[64];
read(fd, buf, 64);
//do something with buf
} else {
fprintf(stderr, "Timed out while reading from my_pipe\n");
//do something else in the program
}
}
我曾希望使用
POLLIN
标志的 poll
函数能够解决问题,但事实并非如此。通过我的简单试验,我发现它只是等待另一个进程以写入方式打开命名管道(而不是等到有数据可用,例如 read()
不会阻塞)。顺便提一下,由于某种原因,poll
忽略了超时设置,似乎会无限期地阻塞,直到另一个进程打开该管道为止。我能想到的唯一其他解决方案是使用
O_NONBLOCK
选项来 open()
文件,并手动监控时间流逝,不断尝试读取 0 字节。是否有更好的解决方案?
编辑:我这里的进程在打开命名管道时会阻塞。然而,如果您使用
O_NONBLOCK
选项,则文件会立即打开。此时,可以使用 poll()
函数等待(可选超时)管道的另一端被打开以进行写入。然而,这仍然具有实现
read()
函数超时的行为。即使使用O_NONBLOCK
打开管道,它仍然似乎在调用read()
时被阻塞。
read
阻塞,而是open
。 - undefinedpoll
不会等待字节可用。当与管道一起使用时,带有POLLIN
的poll
会等待管道的“另一端”被打开。对于普通文件,POLLIN
总是立即返回。 - undefinedopen
这一步。只有当有人打开管道的另一端时,open
才会返回,而在open
成功之前调用read
是没有意义的。 - undefined