如何在open/write函数中实现超时

6

我想使用命名管道通道,并在写入此管道时实现超时。

fd = open(pipe, O_WRONLY);
write(fd, msg, len);

程序被函数open阻塞,因此使用函数select将无法工作。 谢谢。


O_NONBLOCK不起作用吗? - 5gon12eder
我需要一个带有超时的阻塞。 - Kosterio
1
我从未尝试过这样做,但是使用 inotify + select 可以确定 FIFO 是否准备就绪,然后进行悲观的 open() 并设置 O_NONBLOCK,可能会奏效。 - 5gon12eder
1
你需要有一些进程读取管道或FIFO。你有吗?阅读pipe(7)fifo(7)poll(2) - Basile Starynkevitch
1
你为什么在问?你真正想做什么?FIFO是什么?另一边的进程是什么,它是如何启动的?你能否在两端都改善代码? - Basile Starynkevitch
2个回答

2
阅读pipe(7), fifo(7), poll(2)
在调用open(2)之前,您可能需要设置一个信号处理程序来设置定时器或闹钟(请参见time(7)signal(7)),但我不会这样做。或者,您可以使用O_NONBLOCK标志,因为fifo(7)中提到:
 A process can open a FIFO in nonblocking mode.  In this case, opening
for read-only will succeed even if no-one has opened on the write
side yet, opening for write-only will fail with ENXIO (no such device
or address) unless the other end has already been opened.
然而,你需要在FIFO或管道的另一端有其他进程进行读取。
也许你应该考虑使用unix(7)套接字,即AF_UNIX地址族。它看起来更符合你的情况:将上面的代码(尝试打开一个写入FIFO)改为客户端端的AF_UNIX套接字(使用connect),并将另一个进程更改为AF_UNIX套接字服务器。
正如5gon12eder所评论的,你还可以查看inotify(7)。甚至可能是D-bus我猜FIFO或管道不是你的情况下正确的解决方案。你应该解释更多并给出更广泛的关注和目标。

2

使用 select() 函数及其超时参数。


2
如果是“open”系统调用阻塞的话,它就无法工作(因为“select”和“poll”都需要打开的文件描述符)。 - Basile Starynkevitch
1
你的“打开”操作被阻塞了,直到其他进程以读取模式打开它...Fifo是一种通信对象,所以如果没有对应的情况,让你尝试写入被认为是毫无意义的。正如Basile所说,你应该有一个读取部分。 - Jean-Baptiste Yunès

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接