簡體   English   中英

C 中的管道,用於讀取標准輸入的緩沖區

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

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