Tra*_*ggs 8 python linux named-pipes
我使用创建了一个fifo文件mkfifo.是否可以不受阻塞地打开/写入?我想知道是否有读者是不可知论者.
下列:
with open('fifo', 'wb', 0) as file:
file.write(b'howdy')
Run Code Online (Sandbox Code Playgroud)
只是在开放时停止,直到我cat fifo从另一个外壳做.我希望我的程序能够取得进步,无论数据消费者是否正在观看.
我应该使用不同的Linux机制吗?
Ole*_*nov 12
来自man 7 fifo:
进程可以在非阻塞模式下打开FIFO.在这种情况下,即使在写入端没有打开任何人,打开或只读也会成功,只读打开将因ENXIO(没有这样的设备或地址)而失败,除非另一端已经打开.
所以第一个解决方案就是打开FIFO O_NONBLOCK.在这种情况下,您可以检查errno:如果等于ENXIO,则可以稍后尝试打开FIFO.
import errno
import posix
try:
posix.open('fifo', posix.O_WRONLY | posix.O_NONBLOCK)
except OSError as ex:
if ex.errno == errno.ENXIO:
pass # try later
Run Code Online (Sandbox Code Playgroud)
另一种可能的方法是用O_RDWR标志打开FIFO .在这种情况下它不会阻止.其他过程可以O_RDONLY毫无问题地打开它.
import posix
posix.open('fifo', posix.O_RDWR)
Run Code Online (Sandbox Code Playgroud)