多管道在Ubuntu Linux C中使用dup2编程



谁能告诉我这是什么问题?我得到一个错误grep: c不是文件或目录。如果对1个管道(2个命令)执行相同的模式,它可以完美地工作,但是,如果我对2个管道(3个命令)执行相同的模式,它就会停止工作。

谁能告诉我这段代码出了什么问题?
int main(int argc, char** argv)
{
int pipefd[2];
int pipefd2[2];
char* cmd[3]={"ls",NULL,NULL};
char* cmd2[3]={"grep","c",NULL};
char* cmd3[3]={"wc", NULL, NULL};
pipe(pipefd);
pipe(pipefd2);
if(fork() == 0)
{
if(dup2(pipefd[1],1) < 0)
{
printf("Error in dup2n");
exit(0);
}
close(pipefd2[0]);
close(pipefd2[1]);
close(pipefd[0]);
close(pipefd[1]);
if(execvp("ls", cmd) < 0)
{
printf("Error in execvp lsn");
exit(0);
}
}
if(fork() == 0)
{
if(dup2(pipefd[0],0) < 0)
{
printf("Error in dup2n");
exit(0);
}
if(dup2(pipefd2[1], 1) < 0)
{
printf("Error in dup2n");
exit(0);
}
close(pipefd2[0]);
close(pipefd2[1]);
close(pipefd[0]);
close(pipefd[1]);
if(execvp("grep",cmd2) < 0)
{
printf("Error in execvp grepn");
exit(0);
}
}
if(fork() == 0)
{
if(dup2(pipefd2[0],0) < 0)
{
printf("Error in dup2n");
exit(0);
}
close(pipefd2[0]);
close(pipefd2[1]);
close(pipefd[0]);
close(pipefd[1]);
if(execvp("wc",cmd2) < 0)
{
printf("Error in execvp wcn");
exit(0);
}
}
close(pipefd[0]);
close(pipefd[1]);
close(pipefd2[0]);
close(pipefd2[1]);
wait(NULL);
wait(NULL);
wait(NULL);
return 0;
}

这是由于错误使用execvp造成的。

第一个参数是要执行的文件,第二个参数是一个以空结束的字符串数组,这些字符串表示该文件的适当参数。

实际上,您正在shell中运行grep grep c。您可以尝试一下,并看到同样的效果。

参见手册页https://linux.die.net/man/3/execvp进一步阅读。

最新更新