我使用.delegate()
创建了一个fifo文件。是否可以不受阻塞地打开/写入?无论是否有读者,我都不知道。
以下内容:
mkfifo
直到我从另一个shell执行with open('fifo', 'wb', 0) as file:
file.write(b'howdy')
时才会停止。我希望我的程序能够取得进步,无论数据消费者是否正在观看。
我应该使用不同的Linux机制吗?
答案 0 :(得分:11)
来自man 7 fifo
:
进程可以在非阻塞模式下打开FIFO。在这种情况下,即使在写入端没有打开任何人,打开或只读也会成功,打开只写会因ENXIO(没有这样的设备或地址)而失败,除非另一端已经打开。 / p>
所以第一个解决方案是使用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)