我试图通过在c中使用execvp来执行linux命令,但它没有显示任何内容。我不太了解dup2()函数调用。谁能告诉我这里我做错了什么?
要执行的命令: ls |排序
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <stdbool.h>
int main()
{
char *cmd[2], *cmd2[3];
cmd[0] = "ls";
cmd[1] = NULL;
cmd2[0] = "sort";
cmd2[1] = NULL;
pid_t id;
id = fork();
int pipe1[2];
int pipe2[2];
pipe(pipe1);
pipe(pipe2);
if(id==0)
{
printf("child process with pid =%d \r\n", getpid());
//the read end of pipe not needed,
close(pipe1[0]);
// we want the stdout (1) of this process to be connected to 1 of pipe1.
dup2(pipe1[1],1); //or dups(pipe1[1], stdout_fileno)
//close it aswell not needed
//close(pipe1[1]);
execvp("ls",cmd);
return 1;
}
pid_t id2 = fork();
if(id2==0)
{
close(pipe1[1]);
dup2(pipe1[0], 0);
close(pipe1[0]);
execvp("sort",cmd2);
//return 1;
}
close(pipe1[0]);
close(pipe1[1]);
waitpid(id,NULL,0);
waitpid(id2, NULL, 0);
//execvp("sort",cmd2);
//printf("parent process with pid =%d \r\n", getpid());
return 0;
}
答案 0 :(得分:1)
您只需要一个管道,实际上您只使用一个管道,即使您创建了两个管道。除了你实际创建四之外,因为你在第一个fork()之后创建了管道,因此父和第一个子进程分别创建了两个。
这似乎是个问题。如果您希望两个子进程通过管道进行通信,那么它们必须使用相同的管道。他们会通过从父进程继承管道末端的打开文件描述符来实现这一点,这要求它们使用由进程创建的管道,两个进程都从中生成(即父进程),并在子进程分叉之前创建。就目前而言,只有第二个孩子才这样做;第一种是使用它自己创建的管道,因此它与其他任何东西都没有连接。