gpt4 book ai didi

C 管道标准输出到 fork

转载 作者:太空宇宙 更新时间:2023-11-04 10:04:22 26 4
gpt4 key购买 nike

我正在尝试编写一个执行 ls | 的 C 程序wc 使用管道和 fork ,但我无法弄清楚我的代码有什么问题。当我运行下面的代码时,没有任何返回。

int main() {
pid_t p1, p2;
int fd1[2];

pipe(fd1);

p1 = fork();
if (p1 == 0) {
close(STDOUT_FILENO);
dup2(fd1[1], STDOUT_FILENO);
close(fd1[0]);
execlp("ls", "ls", (char *)NULL);
} else {
p2 = fork();

if (p2 == 0) {
dup2(fd1[0], STDIN_FILENO);
close(fd1[0]);
close(fd1[1]);

execlp("wc", "wc", (char *)NULL);
} else {
waitpid(p2, 0, WUNTRACED);
waitpid(p1, 0, WUNTRACED);
}
}

return 0;
}

最佳答案

你没有清楚地解释这个程序在做什么你认为是错误的。但是,当我自己运行这个程序时(在添加适当的 header 之后——以后,请不要将它们排除在你的问题之外),它会挂起,直到我按下 control-C。我将假设这是您不想要的,而您确实想要的是打印 wc 的输出然后退出。

程序挂起,因为 fd1[1] 在调用 wait 时仍在父进程中打开。 wc 将不会收到 EOF 指示,直到所有 引用管道写入端的文件描述符都已关闭。但是父进程在它的两个子进程退出之前不会关闭管道的写入端,并且 wc 在它获得 EOF 之前不会退出,所以你有一个死锁。

您需要在第一个 if 的父端添加 close(fd1[1]),紧接在 p2 = fork() 之前>。这足以解除僵局。您应该还添加 close(fd1[0])second if 的父端,就在之前waitpid 调用。您还应该检查所有操作是否有错误。

关于C 管道标准输出到 fork,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53631920/

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