我想写一个测试程序,它使用管道在3个linux命令之间传递信息。相当于“ls | wc | wc”的bash。以下是我的代码 我得到的唯一输出是。该程序停留在那里而不退出。管道没有得到EOF
./a.out starting main creating pipe first
在bash的预期结果是一样的东西
ls | wc | wc 1 3 24
编辑:在运行strace的我看得出来,主要工艺是wait4,两个卫生间进程停留在读(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;
}
如何在系统上声明'wait()'?在我的,我必须'#include',然后它不会编译,因为wait()接受一个参数,你没有提供。这是未定义的行为。用-Wall或编译器的等价物编译以启用警告。 –
2014-10-09 08:08:20
我包括#include #include 文件,它给了我一个错误。我用等待的参数修改了代码。 –
woodstok
2014-10-09 08:12:31
只需在strace -f下运行它,看看哪个进程正在做什么。 – Useless 2014-10-09 08:21:19