gpt4 book ai didi

c - 父子进程之间的管道问题

转载 作者:行者123 更新时间:2023-11-30 16:19:22 25 4
gpt4 key购买 nike

使用管道,父亲从标准输入读取并使用管道将其发送到子进程,以便子进程可以对输入执行字数统计。打开和关闭管道 p[0] 和 p[1] 时出现问题。为什么我不能 dup2(p[1],1) 然后 write(1,buffer,1) ?仅当我在没有 dup2(p[1],1) 的情况下 write(p[1],buffer,1) 时它才有效。

int main(int argc, char **argv){
int p[2];
int n;
char buffer[1024];
pipe(p);
if(!fork()){
close(p[1]);
dup2(p[0],0);
close(p[0]);
execlp("wc","wc",NULL);
_exit(0);
}
else{
close(p[0]);
dup2(p[1],1);
while((n=read(0,buffer,1))>0){
write(1,buffer,1);
}
close(p[1]);
wait(NULL);
}
return 0;
}

最佳答案

Why can´t I dup2(p[1],1) and then write(1,buffer,1)?

你可以,尽管这看起来毫无意义。不过,如果您尝试使用(仅)写入 stdout 的 I/O 函数之一,则更有意义。

It only works if I do write(p[1],buffer,1) without dup2(p[1],1).

这取决于你所说的“作品”是什么意思。当我运行您的原始代码时,程序永远不会打印任何输出并且永远不会终止,但这并不意味着父级的写入未成功将数据发送给子级。

问题是 child 不知道什么时候到达输入的末尾。它正在等待其输入上的文件结束信号,只要存在与管道写入端关联的任何打开文件描述符,该信号就不会出现。

如果父进程没有欺骗管道的写入端,那么它只有一个打开的文件描述符,而子进程也有一个。两者都在适当的时间关闭了它们。但在您提供的代码中,父级将 p[1] 复制到文件描述符 1 上,以便它有两个 引用管道端的打开文件描述符。它只会关闭 p[1],使文件描述符 1 保持打开状态,因此子进程会继续等待更多输入。

如果 FD 1 退出,父进程将关闭 FD 1,从而允许子进程完成,但它正在等待子进程首先终止。这是与 I/O 重定向相关的更常见的死锁错误之一。我建议不要让父级复制文件描述符,因为复制到 FD 1 会不必要地阻止其将其标准输出用于任何其他目的。但如果它确实欺骗了,那么它必须在子进程终止之前关闭两个文件描述符。

关于c - 父子进程之间的管道问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55633856/

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