亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

subprocess.Popen文檔 示例代碼意義求解惑

subprocess.Popen文檔 示例代碼意義求解惑

手掌心 2019-04-21 20:41:28
原文鏈接output=`dmesg|grephda`#becomesp1=Popen(["dmesg"],stdout=PIPE)p2=Popen(["grep","hda"],stdin=p1.stdout,stdout=PIPE)***p1.stdout.close()#Allowp1toreceiveaSIGPIPEifp2exits.***output=p2.communicate()[0]關于SIGPIPE信號,我找到這樣的描述"如果你試圖向一個管道或套接口寫入,當讀取方關閉連接,你將得到一個SIGPIPE的信號,它會使進程終止除非指定處理方法。"從大概的意思來看,關閉p1.stdout是為了讓p1收到SIGPIPE信號。但是內在原因不能理解。我們建立了p1到p2的管道,為什么還要takecare他們之間的通信呢?
查看完整描述

2 回答

?
喵喔喔

TA貢獻1735條經驗 獲得超5個贊

這個信號的意義在于:你創建一個管道A|B,當B執行結束了以后,很多情況下A的繼續執行是沒有意義的,這時候發送一個SIGPIPE給A,默認情況下(沒有對應的SigHandler)A就終止了;當然,在需要的情況下,A可以設置一個handler來處理這個信號。
                            
查看完整回答
反對 回復 2019-04-21
?
智慧大石

TA貢獻1946條經驗 獲得超3個贊

當進程P1嘗試向一個管道寫入數據,而管道的另一端沒有進程連接時,P1將受到SIGPIPE信號。
在上述例子中,
當p1,p2創建完畢,管道p1.stdout和p2.stdin都連接到該管道。
這時關閉p1.stdout,則只有p2.stdin從該管道讀取數據。
這樣,當p2結束時,p1再向管道寫入數據,就會收到SIGPIPE信號。
換言之,如果沒有p1.stdout.close(),則p1.stdout一直連接管道,p1不會收到SIGPIPE.
                            
查看完整回答
反對 回復 2019-04-21
  • 2 回答
  • 0 關注
  • 306 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號