我正在尝试编写一个测试程序,它使用管道在3个linux命令之间传递信息。 bash相当于" ls | wc | WC&#34 ;.以下是我的代码 我得到的唯一输出是。该程序在没有退出的情况下卡在那里。
./a.out
starting main
creating pipe first
bash中的预期输出类似于
ls | wc | wc
1 3 24
编辑:在运行strace时,我可以看到主进程在wait4上,两个wc进程停留在read(0)上。正如我猜测的那样,因为wc没有获得EOF。为什么会如此?。有人帮我确定问题吗?
#include<unistd.h>
#include<stdlib.h>
#include<stdio.h>
int p[2];
int p1[2];
int r=0;
int fork1(void)
{
int pid;
pid = fork();
if(pid == -1) {
perror("fork");
exit(1);
}
return pid;
}
int main (int argc, char const* argv[])
{
printf("starting main\n");
printf("creating pipe first\n");
if(pipe(p)<0) {
perror("pipe");
exit(1);
}
if(pipe(p1)<0) {
perror("pipe");
exit(1);
}
if(fork1()==0) {
//send output to p
close(1);
dup(p[1]);
close(p[0]); close(p[1]);
execlp("ls","ls",NULL);
exit(0);
}
if(fork1() == 0) {
close(1);//write to p1
dup(p1[1]);
close(p1[1]); close(p1[0]);
close(0);//read from p
dup(p[0]);
close(p[0]); close(p[1]);
execlp("wc","wc",NULL);
exit(0);
}
if(fork1() == 0)
{
close(0);//read from p1
dup(p1[0]);
close(p1[0]); close(p1[1]);
execlp("wc","wc",NULL);
exit(0);
}
close(p[0]); close(p[1]); close(p1[0]); close(p1[1]);
wait(&r);wait(&r);wait(&r);
printf("parent done\n");
return 0;
}
答案 0 :(得分:2)
问题是我没有关闭每个分支中的所有管道。 我不得不关闭所有三个叉子和父母的p,p1。一旦我添加了它,它就可以了