我正在尝试使用命名管道在守护程序和客户端之间建立双向通信。尝试打开用于输入的命名管道时代码挂起?
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 )
答案 0 :(得分:13)
使用O_RDONLY或打开FIFO时 O_WRONLY设置:
如果设置了O_NONBLOCK,则为 open()仅供阅读使用 不延误。一个open()for 如果只写,则只能返回错误 当前没有进程打开文件 阅读。
如果O_NONBLOCK清除,则打开() 只读会阻止通话 线程直到线程打开文件 写作。一个open()for 只写只能阻止呼叫 线程直到线程打开文件 阅读。
换句话说,当您打开命名管道进行读取时,默认情况下,open将阻塞,直到打开管道的另一侧进行写入。要解决此问题,请使用os.open()
并在命名管道的读取端传递os.O_NONBLOCK
。