繁体   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