我可以在Linux上打开一个命名pipe道用于在Python中进行非阻塞写入吗?

我使用mkfifo创build了一个fifo文件。 是否可以打开/写入这个没有阻止? 我想不pipe是否有读者都不知道。

下列:

 with open('fifo', 'wb', 0) as file: file.write(b'howdy') 

直到我从另一个壳上做了一个cat fifo 。 无论有没有数据消费者观看,我都希望我的程序能够取得进展。

有没有我应该使用的不同的Linux机制?

man 7 fifo

进程可以在非阻塞模式下打开一个FIFO。 在这种情况下,即使没有人打开写入端,打开或只读也会成功,除非另一端已经打开,否则打开只写将失败,ENXIO(没有这样的设备或地址)。

所以第一个解决方案是用O_NONBLOCK打开FIFO。 在这种情况下,您可以检查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 

另一种可能的方法是用O_RDWR标志打开FIFO。 在这种情况下它不会阻塞。 其他进程可以用O_RDONLY打开它没有问题。

 import posix posix.open('fifo', posix.O_RDWR)