gpt4 book ai didi

c - Unix Pipes - 三个进程之间的管道

转载 作者:行者123 更新时间:2023-11-30 17:44:14 27 4
gpt4 key购买 nike

我正在创建一个包含三个进程的小程序;源进程、过滤进程和汇进程。源进程的stdout被重定向到filter进程的stdin,filter进程的stdout被重定向到sink进程的stdin。

我的问题是接收器进程没有输出打印到标准输出。你们谁能看出下面这段小代码中的问题吗?

#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>


int main(int argc, char** argv)
{
// Pipes
// pipe1 is from source to filter, pipe2 is from filter to sink
int pipe1[2], pipe2[2];

// Create pipes
if (pipe(pipe1) < 0 || pipe(pipe2) < 0)
{
perror("Creating pipes failed!");
}

if (fork() == 0)
{
close(1);
dup(pipe1[1]);
close(pipe1[0]);

close(pipe2[0]);
close(pipe2[1]);

execlp("ls", "ls", NULL);
exit(0);
}
else
{
if (fork() == 0)
{
close(0);
dup(pipe1[0]);
close(pipe1[1]);

close(1);
dup(pipe2[1]);
close(pipe2[0]);

execlp("sort", "sort", NULL);
exit(0);
}
else
{
if (fork() == 0)
{

close(0);
dup(pipe2[0]);

execlp("more", "more", NULL);
exit(0);
}
}
}


wait(NULL);
printf("Done.\n");

return 0;
}

BR

雅各布

最佳答案

我认为问题可能是,wait只会等待一个进程。当第一个子返回后父退出时,我怀疑 more 命令也决定终止,因为它可能会收到 SIGHUP (推测,不确定)。

但是,请检查所有系统调用中的错误!另外,对于成功的 wait 调用,打印子进程退出的原因(是信号退出还是正常退出,如果是正常退出,退出代码是什么)。

另请注意,perror 不会退出,它只会打印。

如果代码中没有错误处理,试图了解为什么某些代码会失败是毫无意义的...

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

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