2011-05-18 113 views
6

17.1.4.2: Replacing shell pipeline說更換解釋例如從Python子模塊的Python的子模塊

output=`dmesg | grep hda` 

p1 = Popen(["dmesg"], stdout=PIPE) 
p2 = Popen(["grep", "hda"], stdin=p1.stdout, stdout=PIPE) 
p1.stdout.close() # Allow p1 to receive a SIGPIPE if p2 exits. 
output = p2.communicate()[0] 

第三行中的註釋解釋了爲什麼近函數被調用,但不是爲什麼它是有道理的。它對我沒有。在調用通信方法之前不會關閉p1.stdout阻止通過管道發送任何輸出? (顯然它不會,我試圖運行代碼,它運行良好)。 爲什麼是否需要調用close來使p1接收SIGPIPE?什麼樣的關閉是不關閉的?到底什麼呢?

請考慮這是一個學術問題,除了更好地理解這些東西之外,我並不試圖完成任何事情。

+0

stdin和stdout是文件。所以你應該關閉它們以釋放管道。 – JBernardo 2011-05-18 15:10:14

回答

10

您正在關閉p1.stdout中的父級進程,從而使dmesg成爲打開該文件描述符的唯一進程。如果你沒有這樣做,即使當dmesg關閉它的stdout時,你仍然會打開它,並且不會生成SIGPIPE。 (操作系統基本上保持一個引用計數,並在它達到零時生成SIGPIPE,如果不關閉該文件,則阻止它達到零。)