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 回答