我正在创建一个包含三个进程的小程序;源进程,过滤进程和接收进程。源进程的stdout被重定向到筛选器进程的stdin,并且筛选器进程'stdout被重定向到接收进程'stdin。
我的问题是没有输出从接收器进程打印到stdout。您是否可以在以下微小的代码片段中看到问题?
#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
雅各
答案 0 :(得分:0)
我认为问题可能是,wait
只会等待一个进程。当父母在第一个孩子返回后退出时,我怀疑more
命令也决定终止,因为它可能会获得SIGHUP(猜测,不确定)。
但是,请检查所有系统调用中的错误!同样对于成功的wait
次调用,打印孩子退出的原因(是信号还是正常退出,如果是正常退出,退出代码是什么)。
另请注意,perror
不会退出,只会打印。
尝试查看为什么某些代码失败,如果它没有错误处理,这是毫无意义的......
答案 1 :(得分:0)
为您的方案执行管道的一些简单方法:
char cmd[MAX_LEN];
sprintf(cmd, "%s | %s | %s", app1, app2, app3); //app123 holds app name + args
system(cmd);
如果要捕获最后一个应用的输出,请使用popen:
FILE pPipe = popen(cmd, "rt"); /* same access flag as fopen()*/
while (NULL != fget(buf, buf_len, pPipe)) {
// do something with the read line in 'buf'
}