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

Posted

技术标签:

【中文标题】Linux:打开命名管道进行写入时超时【英文标题】:Linux: timeout when opening named pipe for writing 【发布时间】:2012-03-07 23:30:51 【问题描述】:

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

【问题讨论】:

【参考方案1】:

如果是一个选项,请在这样的场景中使用 unix 域套接字。由于 FIFO 的语义,这是一种笨拙的方法,而且无论如何您都可能会遇到问题。如果有必要,这种设计不会扩展到一个客户之外。您也许可以在短期内对 FIFO 强制执行您的意愿,但我怀疑您会后悔的。

套接字更适合这种情况。您的侦听套接字非常适合您现有的 poll(),客户端连接,作者转储他的数据,两端断开连接,每个人都很高兴。不要大惊小怪,不要大惊小怪。

【讨论】:

谢谢,我希望避免设置套接字,但您的观点绝对有效。【参考方案2】:

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

【讨论】:

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

以上是关于Linux:打开命名管道进行写入时超时的主要内容,如果未能解决你的问题,请参考以下文章

无法打开 Windows 命名管道进行写入?

Linux - 进程间通信 - 命名管道

程序打开同一个命名管道并用 C 多次写入

c中的命名管道

我需要刷新命名管道吗?

在 Linux 中写入命名管道的最佳、最安全的方法是啥?