2011-06-05 152 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