簡體   English   中英

Python subprocess.Popen PIPE和SIGPIPE

[英]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))

但是,我不清楚這一點。 請理解我的理解。

  1. PIPE嘗試寫入已關閉的PIPE時發生SIGPIPE
  2. 作家PIPEproc1stdout ,讀者PIPEproc2stdin
  3. proc1將在proc2退出時退出, proc1嘗試將數據寫入proc2stdin PIPE 因為
    • proc2stdin PIPE被關閉時proc2退出
    • SIGPIPE發生在proc1因為proc1試圖寫入已關閉的proc2stdin PIPE

根據我的理解,無論關閉proc1stdoutSIGPIPE都會發生並且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.stdoutproc1獲取(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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM