在父进程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. -close-
4. -close-
答案 0 :(得分:2)
它将在dup(fd [1];,
之后有2个fd [1]。
不。 fd[1]
的值永不变。如果在调用dup
之前是4,则在调用dup
之后是4。
为什么系统在结果中关闭了第二个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,封闭管端,开放管端
然后关闭标准输出:
... 0 .... | ... 1 .... | ..... 2 ..... | ... fd [0] .. | ... fd [1] .....
stdin,封闭,stderr,封闭,开放管端
然后将裸露的管端进行复制:
... 0 .... | .................. 1 ............. | ..... 2 ..... | ..fd [0] .. | ....... fd [1] .....
stdin,开放管端的dup,stderr,封闭,开放管端的
然后关闭fd [1]:
... 0 .... | .................... 1 ............ | .... .2 ... | ... fd [0] .. | ..fd [1] .....
stdin,开口管末端重复,stderr,关闭,关闭
或更简单地说:
... 0 ... | ................... 1 ...... | ... .2 ....
stdin,开口管末端重复,stderr
因此,当您调用execl
时,新进程将继承父级的标准输入和标准错误,但会继承其管道一端的副本作为其标准。
输出。