我正在尝试在我用 C 编写的简单 shell 程序中实现管道。
但是由于某种原因,当我尝试运行ls | wc -l
时,我没有得到输出。
我真的不确定为什么会发生这种情况,因为我基本上将子进程的输出放在管道指示器之前执行命令的pipe[1]
,我将父进程的输入放在管道指示器之后执行命令pipe[0]
,它应该打印到终端,因为父进程的输出从未更改过, 我现在的方法是,如果管道被标记为 Child 中的呼叫叉并执行管道。
下面的代码
int pipe1[2];
int pipepid;
int piping; /*flag for piping*/
int pipeposition;/*index of pipe indicator*/
//* code... */
if(pipe(pipe1)!= 0){
perror("pipe");
exit(1);
};
/* split commands to before pipe indicator and after */
for(int p = 0;p<pipeposition;p++){
argsbefore[p]=args[p];
}
/* after */
int e=0;
for(int h = pipeposition+1; h<cnt;h++){
argsafter[e]=args[h];
e++;
}
/* code ... */
if(piping){
pipepid = fork();
if(pid == 0){
/* do child */
if(dup2(pipe1[1],1)==-1){
perror("dup2 child");
exit(1);
}
close(pipe1[1]);
if (execvp(argsbefore[0], argsbefore) < 0) {
printf("exec failedn");
exit(1);
}
exit(0);
}/* else if error */
else if(pid == -1){
printf("ERROR: fork failedn");
exit(1);
}/* parent */
else{
if(dup2(pipe1[0],0)==-1){
perror("dup2 parent");
exit(1);
}
close(pipe1[0]);
if (execvp(argsafter[0], argsafter) < 0) {
printf("exec failedn");
exit(1);
}
}
}
你似乎在一个类似Unix的系统上这样做。如果幸运的话,您的系统可能有一个工具可以报告每个系统调用您的程序执行(strace -f my_program my_ar gu_ments
会在Linux上执行此操作)。
这将为您提供一个列表,说明哪个进程在何时执行了什么操作,以及某些操作是否存在错误代码。这通常对这些多进程设置有很大帮助。
事实证明我没有关闭所有管道,因此第二个命令无法完成,在主父进程中关闭两端后,它被修复了