【发布时间】:2014-09-13 07:11:20
【问题描述】:
我的总体目标是当(且仅当)有读取器连接到命名管道时,将报告信息传递到命名管道。如果没有阅读器,我想避免构建报告信息等。由于这发生在通过select() 处理其他数据流的场景中,我想将命名管道添加到“准备写入”的流中”。
所以,我想打开一个命名管道进行写入,并且需要以某种方式将其提供给 select(),以便 select() 仅在命名管道的另一端确实有读取器的情况下返回。
通常,如果没有阅读器,open 调用已经挂起;不幸的是,我无法对select() 执行open 操作——只有打开的文件描述符才有效。
为了获得一个像样的文件描述符,我目前正在创建一个虚拟阅读器(我打开命名管道以读取自己),然后打开它进行写入,然后再次关闭虚拟阅读器:
dummy = os.open(fifoPath, os.O_RDONLY | os.O_NONBLOCK)
# ^^^ without the NONBLOCK, this will hang until another process is ready to write
fifo = os.open(fifoPath os.O_WRONLY)
os.close(dummy)
如果我现在打开另一个阅读器,他会收到我写入命名管道的内容,所以这个方面是有效的。
但是现在select() 总是将fifo 返回为准备写入,即使没有连接阅读器:
r, w, e = select.select([], [ fifo ], [])
print w[0]
这将始终同时打印fifo 值。
无论我写多少,写入命名管道也不会挂起:
fifo.write('foo')
我刚才写的数据因为没有连接读卡器而丢失了。
当打开我的虚拟阅读器时,我传递了标志O_NONBLOCK,因为否则这个开口也会挂起。我尝试了各种方法,但无法弄清楚如何正确地做到这一点。
谁能告诉我如何将写入命名管道与select() 结合起来?
(上面的代码是用 Python 编写的,但我猜这个问题并不是真正与 Python 相关,而是 Linux/Unix 问题,所以我不会将这个问题标记为 Python。)
【问题讨论】:
标签: linux select named-pipes nonblocking fifo