没有结果!!使用fork()使用dup2运行带有2个管道的execlp()

时间:2013-01-12 04:09:06

标签: c linux exec fork pipe

我正在编写一个运行Linux命令的C程序,例如:
cat /etc/passwd | grep list | cut -c 1-5
我没有任何结果
*这里父母等待第一个孩子(child_pid)完成;
第一个孩子等待第二个孩子(pfils)!!
任何想法?
代码:

main()
{
    pid_t child_pid;
    int fd[2];
    int pfd[2];
    pipe(pfd);
    child_pid = fork ();

    if (child_pid != 0) 
    {
        wait(child_pid);
        close(pfd[1]);
        dup2(pfd[0],0);
        close(pfd[0]);
        execlp("cut","cut","-c","1-5",NULL);
    }
    else
    {
        pid_t pfils = fork();
        pipe(fd);

        if(pfils == 0)
        {
            close(fd[0]);
            dup2(fd[1],1);
            close(fd[1]);
            execlp("cat", "cat","/etc/passwd",NULL);
        }
        else
        {
            wait(pfils);
            close(fd[1]);
            dup2(fd[0],0);
            close(fd[0]);
            close(pfd[0]);
            dup2(pfd[1],1);
            close(pfd[1]);
            execlp("grep","grep","list",NULL);
        }
    }
}

1 个答案:

答案 0 :(得分:5)

    pid_t pfils = fork();
    pipe(fd);

Fork将制作该过程的副本。该过程的独立副本。因此,如果您在fork之后调用pipe,则进程的每个副本都会获得自己的管道。将fork()放在fork()之前,它应该可以工作。