【问题标题】:Can I open a named pipe on Linux for non-blocked writing in Python?我可以在 Linux 上打开命名管道以在 Python 中进行非阻塞写入吗?
【发布时间】:2016-01-12 21:49:14
【问题描述】:

我使用mkfifo 创建了一个fifo 文件。是否可以在不阻塞的情况下打开/写入它?我想不知道是否有读者。

以下内容:

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

在我从另一个 shell 执行 cat fifo 之前,我只是在开放时停止。无论是否有数据消费者在观看,我都希望我的程序能够取得进展。

我应该使用不同的 linux 机制吗?

【问题讨论】:

    标签: python linux named-pipes


    【解决方案1】:

    来自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)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-01-25
      • 1970-01-01
      • 2017-06-23
      • 2010-10-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多