Linux:打开命名管道进行写操作时超时

5

我有一个进程通过命名管道向另一个进程写入数据。可能会出现读取进程没有打开管道的异常情况。如果发生这种情况,我的编写良好的写入进程将在其open() 调用上挂起。 我希望在打开管道时能够设置超时,以便如果读者没有及时打开它的一端,编写器可以进行清理并继续运行。非阻塞式open()会立即返回错误。

2个回答

3
如果可以选择的话,针对这样的场景使用 Unix 域套接字会更好。由于 FIFO 的语义,这种方式很笨拙,即使是在打开后,你也可能会遇到问题。如果需要扩展到一个客户端以上,该设计就无法实现可扩展性。或许你可以在短期内强制使用 FIFO,但我怀疑你最终会后悔。
相比之下,套接字更加自然地适合这种情况。你的监听套接字完美地配合了现有的 poll(),客户端连接,编写者将数据倾倒,双方断开连接,所有人都很满意。不需要麻烦,也不会出乱子。

谢谢,我本来希望能避免设置套接字,但你的观点绝对是正确的。 - gimmeamilk

0

在您的写入进程中以读写模式打开管道,这样应该可以防止它挂起 :)


如果我这样做,我怎么知道另一个进程已经打开并可以进行读取了? - gimmeamilk
非阻塞打开返回什么错误?您是否尝试使用读写模式的非阻塞模式?您应该能够测试(使用select或poll)管道是否准备好进行写入 - 如果是,则意味着客户端已连接到另一端。 - sirgeorge
1
如果我以RW模式打开了poll(),即使另一端尚未打开,它也会立即返回可写。 - gimmeamilk

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