Python代码在尝试打开一个命名管道以进行读取时挂起。

12

我试图使用命名管道设置守护进程和客户端之间的双向通信。但是当尝试打开用于输入的命名管道时,代码会挂起。为什么?

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 )

1
读写管道会阻塞,直到相应的读取器或写入器连接。 - tMC
1个回答

14

根据open()的规范:

当以O_RDONLY或O_WRONLY方式打开FIFO时:

如果设置了O_NONBLOCK,则只读方式打开的open()将立即返回,写入方式打开的open()将在没有任何进程以阅读方式打开该文件时返回错误。

如果未设置O_NONBLOCK,则只读方式打开的open()将阻塞调用线程,直到某个线程以写入方式打开该文件。写模式下打开的open()将阻塞调用线程直到某个线程以读取方式打开该文件。

换句话说,当您打开具有命名管道时,读取默认情况下将阻塞,直到管道的另一端被打开为写入。要解决此问题,请在命名管道的读取侧使用os.open()并传递os.O_NONBLOCK


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接