7
我有一個像下面這樣的結構:鏈POPEN子進程正常
os.mkfifo('pipe.tmp')
enc = Popen(['encoder', '-i', 'pipe.tmp'])
cap = Popen(['capture', '-f', 'pipe.tmp'])
這裏cap
是一個過程,通常寫到一個文件(由-f
指定的),但我可以得到它的數據噴涌到屏幕通過提供/dev/stdout
作爲輸出文件。同樣,enc
期望從類文件對象中讀取,並且我可以通過提供-
作爲輸入來從管道中讀取它。所以不是在操作系統中使用命名管道,我認爲特殊的文件可能沒有必要,我可以用一個無名管這樣的..
cap = Popen(['capture', '-f', '/dev/stdout'], stdout=PIPE)
enc = Popen(['encoder', '-i', '-'], stdin=cap.stdout)
cap.stdout.close()
(還要注意的產卵的順序顛倒)。我更喜歡這樣做,因爲臨時文件似乎沒有必要,但我有點擔心這個構造是否會按我期望的方式鏈接進程。
- 是
/dev/stdout
是cap
是從OS的實際標準輸出談論不同?也就是說,在輸入管道-
的enc
中,即使其他進程正在與OS上的/ dev/stdout聊天,我是否還會在這兩個進程之間獲得乾淨的數據通道? - 在阻塞/排隊行爲方面會有什麼顯着差異嗎?我認爲在我的第一個例子中,命名管道將是一個緩衝的4096字節,並且如果
cap
/enc
不夠快寫入/讀取,將在任一端阻塞,但如果我錯了,請糾正我。 - 是需要產卵或終止的任何特殊順序,還是我應該知道的任何其他陷阱?