[英]Python subprocess.Popen PIPE and SIGPIPE
當我瀏覽帖子時,我在這里遇到了這個例子,這就是說需要調用proc1.stdout.close()
以適當退出proc1
,生成SIGPIPE
。
import subprocess
proc1 = subprocess.Popen(['ps', 'cax'], stdout=subprocess.PIPE)
proc2 = subprocess.Popen(['grep', 'python'], stdin=proc1.stdout,
stdout=subprocess.PIPE, stderr=subprocess.PIPE)
proc1.stdout.close() # Allow proc1 to receive a SIGPIPE if proc2 exits.
out, err = proc2.communicate()
print('out: {0}'.format(out))
print('err: {0}'.format(err))
但是,我不清楚這一點。 請理解我的理解。
PIPE
嘗試寫入已關閉的PIPE
時發生SIGPIPE
。 PIPE
是proc1
的stdout
,讀者PIPE
是proc2
的stdin
。 proc1
將在proc2
退出時退出, proc1
嘗試將數據寫入proc2
的stdin PIPE
。 因為
proc2
的stdin PIPE
被關閉時proc2
退出 SIGPIPE
發生在proc1
因為proc1
試圖寫入已關閉的proc2
的stdin PIPE
。 根據我的理解,無論關閉proc1
的stdout
, SIGPIPE
都會發生並且proc1
會退出。
我錯過了什么?
閱讀@ unutbu評論后的帖子 ......
我認為復制的文件描述符( proc1.stdout
)是writer PIPE,而不是reader PIPE。 因此,有兩個作者PIPE和一個讀者PIPE相互連接。
因此,當proc2
退出時將生成SIGPIPE
因為proc2
只是一個具有閱讀器PIPE的進程(將在proc2
退出時關閉)。
但是,上面的帖子似乎說通過復制proc1.stdout
有兩個讀者proc1.stdout
所以即使在proc2
退出后也不會生成SIGPIPE
因為還有另一個讀者PIPE打開。 以下是帖子的一部分。
因此,通過立即關閉p1.stdout,您可以確保從dmesg stdout讀取的唯一剩余文件句柄是grep進程,如果該進程要退出,則dmesg會收到SIGPIPE。
我並不是說帖子錯了,但我只是想解決我的理解。 先感謝您。
proc1 = subprocess.Popen(['ps', 'cax'], stdout=subprocess.PIPE)
在父進程和proc1
之間創建一個管道:
| | | |
| parent |-<-----<-| proc1 |
| | ^ | |
|
p1.stdout
p1.stdout
是父p1.stdout
從proc1
獲取(stdout)輸出的內容。
proc2 = subprocess.Popen(['grep', 'python'], stdin=proc1.stdout,
stdout=subprocess.PIPE, stderr=subprocess.PIPE)
連接從proc1到proc2的管道副本:
| | | | | |
| parent |-<-----<-| proc1 |->----->-| proc2 |
| | | | | |
通過調用p1.stdout.close()
,我們關閉管道的父進程端:
| | | | | |
| parent | <-| proc1 |->----->-| proc2 |
| | | | | |
現在,當proc2
終止時,管道的一側也會關閉:
| | | | | |
| parent | <-| proc1 |-> | proc2 |
| | | | | |
proc1
下次嘗試寫入管道時,會生成一個SIGPIPE信號,該信號允許proc1
終止,因為它知道沒有人正在監聽其管道的另一端。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.