使用c中的系统调用管道命令时输出没有显示任何内容?

时间:2016-06-09 16:17:52

标签: c operating-system pipe

我试图通过在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;
}

1 个答案:

答案 0 :(得分:1)

您只需要一个管道,实际上您只使用一个管道,即使您创建了两个管道。除了你实际创建之外,因为你在第一个fork()之后创建了管道,因此父和第一个子进程分别创建了两个。

这似乎是个问题。如果您希望两个子进程通过管道进行通信,那么它们必须使用相同的管道。他们会通过从父进程继承管道末端的打开文件描述符来实现这一点,这要求它们使用由进程创建的管道,两个进程都从中生成(即父进程),并在子进程分叉之前创建。就目前而言,只有第二个孩子才这样做;第一种是使用它自己创建的管道,因此它与其他任何东西都没有连接。