簡體   English   中英

在C中關閉管道文件描述符

[英]Closing pipe file descriptor in C

這是代碼:

int main() {

    int fd[2];
    pipe(fd);
    int r = fork();
    if (r > 0) { //parent
        close(fd[0]);
        // do a bunch of things
    } else { //child
        close(fd[1]);
        // do a bunch of things
    return 0;
}

這是一段代碼,父母在其中寫入管道,孩子在其中讀取管道。 我的問題是:對於這兩個關閉的語句,它們到底要關閉什么? 父母和孩子應該共享相同的文件,即fd [0]和fd [1]。 如果fd [0]在父級中關閉,那么它也應該在子級中關閉嗎?

http://linux.die.net/man/2/pipe pipe()創建一個管道,該管道由兩個文件描述符組成,這兩個文件描述符分別與管道的兩個“端”(讀取端和寫入端)相對應。 它實際上與文件不是同一回事。 內核正在從寫端讀取數據,為您緩沖數據,然后將其傳輸到讀端。

這應該很清楚為什么pipe()創建兩個文件描述符。 寫入器將所需的所有數據寫入到寫入fd中,然后關閉fd。 這也觸發發送EOF 讀取器通常會一直讀取數據,直到遇到EOF並關閉其末端為止。 在這種情況下,有一段時間會關閉寫入fd,但數據仍在管道中緩沖,等待讀取器將其讀出。 只有一個fd沒有意義,因為您將需要在編寫器和讀取器進程之間進行另一層協調,否則誰將在何時完成?

pipe()調用始終返回一個整數數組,其中數組的第一個元素是要從管道讀取的讀取描述符,第二個元素是要寫入管道的寫入描述符。 管道提供一種單向通信。 如果在父級和子級中都關閉fd [0],則無處可讀取管道;相反,如果在兩個進程中都關閉fd [1],則無法寫入管道,因此我們關閉讀取一個進程中的描述符,以便該進程只能寫,而另一個進程將關閉寫描述符,這將使該進程只能從管道讀取。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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