2011-06-05 180 views
10

我想在守护进程和使用命名管道的客户端之间建立双向通信。代码在尝试打开用于输入的命名管道时挂起为什么?python命名管道问题

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 2011-06-05 05:57:46

+0

谢谢,也更多的挖掘后,这里是一个深入的解释http://stackoverflow.com/questions/5782279/python-why-does-a-read -only-open-a-named-pipe-block – 2011-06-05 06:00:10

+0

可能的重复http://stackoverflow.com/questions/5782279/python-why-does-a-read-only-open-of-a-named-pipe -块。编辑:正如你在我输入我的评论时发现的那样。 – andrewdski 2011-06-05 06:04:01

回答

12

specification for open()

当用户打开带有O_RDONLY或 一个FIFO O_WRONLY设置:

如果设置了O_NONBLOCK,一个 的open()用于读,只应在没有返回 延迟。如果 没有进程当前有文件打开 进行读取,则只写的 的开放()将返回错误。

如果O_NONBLOCK是清楚的,开放的()为 阅读,只有等到一个线程打开文件 为书面形式,阻止调用线程 。打开()为 只写应阻止调用 线程,直到线程打开文件 供读取。

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