簡體   English   中英

在pipe()和fork()之后,為什么父級中的close(fd [1])關閉* child's * fd [1]?

[英]After a pipe() and fork(), why does close(fd[1]) in the parent close the *child's* fd[1]?

在父進程中, close(fd[1]);
為什么它將跳過第一個fd [1](已替換父STD_OUT)並在子進程中關閉fd [1]?

#define STD_INPUT 0
#define STD_OUTPUT 1
int fd[2];
pipe(fd[0]);

if(fork()!=0){
    // parent process
    close(fd[0]);
    close(STD_OUTPUT);
    dup(fd[1]);
    close(fd[1]);
    excel(process1, process1, 0);
}
else{
    // child process
    // ...
}

更新
dup(fd[1];之后,它將有2 fd [1]
為什么系統在結果中關閉第二個fd [1](4。[write])? 不是第一個fd [1](2。[write])?

開始叉
1. STD_IN
2. STD_OUT
3. [閱讀]
4. [寫]

結果
1. STD_IN
2. [寫]
3.-關閉-
4.-關閉-

dup(fd [1];之后將有2 fd [1],

fd[1]的值永不變。 如果是4調用之前dup ,這是4后調用dup

為什么系統在結果中關閉第二個fd [1](4。[write])? 不是第一個fd [1](2。[write])?

如果fd[1]為4,則close(fd[1]); 將關閉描述符4。它將不會影響碰巧引用同一端點的任何其他描述符。

在調用pipe之前,您的進程已經具有文件描述符0、1和2作為其標准輸入,標准輸出和標准錯誤。 然后,為管道創建兩個新的描述符。

因此,這幾乎是您調用fork時的樣子:

... 0 ... | .... 1 .... | ..... 2 .... | .... fd [0] .... | ..... fd [1 ] .....
stdin,stdout,stderr,管端,其他管端

然后,在父級中,關閉fd[0] ,因此您具有:

... 0 ... | .... 1 ...... | ..... 2 ... | .... fd [0] ............. ... | ...... fd [1] .....
stdin,stdout,stderr,封閉管端,開放管端

然后關閉stdout:

... 0 .... | ... 1 .... | ..... 2 ..... | ... fd [0] .. | ... fd [1] .....
標准輸入,封閉,標准錯誤,封閉,開放管端

然后將開放管端復制:

... 0 .... | .................. 1 .......... | ..... 2 .. ... | ..fd [0] .. | ..fd [1] .....
stdin,開放管端的dup,stderr,封閉,開放管端

然后關閉fd [1]:

... 0 .... | ....................... 1 ............ | ..2。 .. | ... fd [0] .. | ..fd [1] .....
stdin,開放管端的dup,stderr,關閉,關閉

或者,更簡單地說:

... 0 ... | ................... 1 ...... | .... 2。 ...
stdin,開放管端的dup,stderr

因此,當您調用execl ,新進程將繼承父級的標准輸入和標准錯誤,但會繼承其管道一端的副本作為其標准輸出。

暫無
暫無

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

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