[英]Pipes in C, buffer for reading stdin
我試圖理解這個答案。 特別是,數據如何跨流程流動?
I assume that input stream flows through a child's input through output connected with pipe, then is collected by a parent through pipe output. 但是,在新一輪循環並在子進程中執行命令之前,讀取的數據會發生什么情況?
數據是否在父進程中緩沖(不知何故?我想知道是什么原因造成的),稍后這個緩沖區被復制並在fork()
之后傳遞給子進程,然后子進程將保存的輸入傳遞給exec()
?
有一個與 pipe 關聯的緩沖區。
如果緩沖區未滿,則寫入將返回,程序將繼續。
但是緩沖區有可能被填滿。 如果寫入無法完成,它將導致部分寫入(使用提供的寫入量)或阻塞直到寫入可以完成(即當某物最終從另一端讀取時)。
試圖從空 pipe 讀取的讀者通常會阻塞,直到數據可用。 如果描述符被設為非阻塞,則讀取將返回錯誤 EWOULDBLOCK 或 EAGAIN。
select
和類似機制可用於檢測何時可以安全地執行讀取或寫入而不會阻塞。
pipe 的每一端都可以獨立閉合。 僅在關閉文件描述符的所有副本后才關閉結尾。 這包括繼承的副本。 一個常見的場景是子代從其父代繼承 pipe。 父級將關閉其描述符之一,而子級將關閉另一個。 這使得一個進程能夠寫入 pipe,而另一個進程能夠從中讀取。 (雙向通信需要兩個管道或一個套接字。)
如果讀者退出會發生什么? 默認情況下,寫入已關閉的 pipe 會產生 SIGPIPE 信號。 默認情況下,這會終止寫入過程。 這通常非常有用。 例如,考慮在很長的 stream 上使用head
的情況。 但它並不總是有用的。 有時,您想檢測並處理這種情況。 幸運的是,通過使用通常的機制處理或忽略信號,這是完全可配置的。 如果忽略,寫入操作將失敗並出現錯誤代碼 EPIPE。
系統之間的行為會有差異。 例如,Windows 沒有信號*, select
不適用於管道。 (不過,它確實適用於 sockets。)但它也提供了執行異步 I/O 的替代方法。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.