C语言 父进程和子进程之间的管道问题



父亲使用管道从标准输入中读取并使用管道将其发送到子进程,以便子进程可以对输入执行字数统计。 打开和关闭管道 p[0] 和 p[1] 的问题。 为什么我不能 dup2(p[1],1) 然后写(1,buffer,1)?它只有在我写(p[1],buffer,1)而不写dup2(p[1],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;
}

为什么我不能 dup2(p[1],1) 然后写(1,buffer,1)?

你可以,尽管这似乎毫无意义。 但是,如果您尝试使用(仅)写入 stdout 的 I/O 函数之一,这将更有意义。

它只有在我写(p[1],

buffer,1)而不写dup2(p[1],1)时才有效。

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

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

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

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

最新更新