11

名前付きパイプを使用して、デーモンとクライアント間の双方向通信をセットアップしようとしています。入力に使用される名前付きパイプを開こうとすると、コードがハングする なぜ?

class comm(threading.Thread):

def __init__(self):
    self.srvoutf = './tmp/serverout'
    self.srvinf = './tmp/serverin'
    if os.path.exists(self.srvoutf):
        self.pipein = open(self.srvoutf, 'r') 
        #-----------------------------------------------------Hangs here
    else:
        os.mkfifo(self.srvoutf)
        self.pipein = open(self.srvoutf, 'r')
        #-----------------------------------------------------or here
    if os.path.exists(self.srvinf):
        self.pipeout = os.open(self.srvinf, os.O_WRONLY)
    else:
        os.mkfifo(self.srvinf)
        self.pipeout = os.open(self.srvinf, os.O_WRONLY)
        
    threading.Thread.__init__ ( self )
4

1 に答える 1

13

open()の仕様から:

O_RDONLY または O_WRONLY が設定された FIFO を開く場合:

O_NONBLOCK が設定されている場合、読み取り専用の open() は遅延なく返されます。現在読み取り用にファイルを開いているプロセスがない場合、書き込み専用の open() はエラーを返します。

O_NONBLOCK がクリアされている場合、読み取り専用の open() は、スレッドが書き込み用にファイルを開くまで、呼び出しスレッドをブロックします。書き込み専用の open() は、スレッドが読み取り用にファイルを開くまで、呼び出しスレッドをブロックします。

つまり、名前付きパイプを読み取り用に開くと、デフォルトでは、パイプの反対側が書き込み用に開かれるまで、オープンはブロックされます。これを修正するには、名前付きパイプの読み取り側で使用os.open()して渡します。os.O_NONBLOCK

于 2011-06-05T06:03:39.073 に答える