python命名管道问题

时间:2011-06-05 05:53:56

标签: 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 个答案:

答案 0 :(得分:13)

来自specification for open()

  

使用O_RDONLY或打开FIFO时   O_WRONLY设置:

     

如果设置了O_NONBLOCK,则为   open()仅供阅读使用   不延误。一个open()for   如果只写,则只能返回错误   当前没有进程打开文件   阅读。

     

如果O_NONBLOCK清除,则打开()   只读会阻止通话   线程直到线程打开文件   写作。一个open()for   只写只能阻止呼叫   线程直到线程打开文件   阅读。

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