gpt4 book ai didi

c - 在 pipe() 和 fork() 之后,为什么父级中的 close(fd[1]) 会关闭 *child 的 * fd[1]?

转载 作者:太空宇宙 更新时间:2023-11-04 07:48:40 25 4
gpt4 key购买 nike

在父进程中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])?

开始 fork
1. 标准输入
2. 标准输出
3. [阅读]
4. [写]

结果
1. 标准输入
2. [写]
3.-关闭-
4.-关闭-

最佳答案

It will have 2 fd[1] after dup(fd[1];,

没有。 fd[1] 的值永远不会改变。如果在调用 dup 之前它是 4,那么在调用 dup 之后它就是 4。

why the system closed the second fd[1](4. [write]) in the result? not first 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, pipe end, other pipe end

然后,在父级中,您关闭 fd[0],因此您拥有:

...0...|....1.....|.....2...|....fd[0]................|......fd[1].....
stdin, stdout, stderr, closed pipe end, open pipe end

然后关闭标准输出:

...0....|...1....|.....2.....|...fd[0]..|......fd[1].....
stdin, closed, stderr, closed, open pipe end

然后复制打开的管端:

...0....|..................1.............|.....2.....|..fd[0]..|.......fd[1].....
stdin, dup of open pipe end, stderr, closed, open pipe end

然后你关闭fd[1]:

...0....|....................1............|.....2...|...fd[0]..|..fd[1].....
stdin, dup of open pipe end, stderr, closed, closed

或者,更简单地说:

...0...|...................1...............|....2....
stdin, dup of open pipe end, stderr

因此,当您调用 execl 时,新进程将继承父进程的标准输入和标准错误,但会继承其管道一端的副本作为其标准输出。

关于c - 在 pipe() 和 fork() 之后,为什么父级中的 close(fd[1]) 会关闭 *child 的 * fd[1]?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55297099/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com