2016-01-12 11 views
6

mkfifoを使用してfifoファイルを作成しました。ブロックすることなくこれを開いたり書きたりすることは可能ですか?読者がいるかどうかに関わらず、私は無関係になりたいです。Pythonでブロックされていない書き込みのためにLinux上で名前付きパイプを開くことはできますか?

次:私は別のシェルからcat fifoを行うまで

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

ちょうどオープンで失速。データの消費者が視聴しているかどうかにかかわらず、私のプログラムが進歩してほしいです。

私はおそらく使用しているはずの別のLinuxのメカニズムはありますか?

答えて

7

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) 
関連する問題