Pipe()fork()和exec

时间:2011-06-02 20:31:59

标签: c shell unix fork pipe

我尝试在迷你shell中添加管道。 当我输入ls |时,我很困惑排序,没有显示,我不明白为什么:

int fd[2];
if (tube == 1){

    int pipeling = pipe(fd);
    if (pipeling == -1){
        perror("pipe") ;
    }
}


    tmp = fork();               //FORK A

    if (tmp < 0){
        perror("fork");
        continue;
    }

    if (tmp != 0) {                 //parent
                while(wait(0) != tmp) ;
                continue ;
    }

    if (tube == 1) {                //there is a pipe

    if (tmp != 0){                  //parent A
        close(fd[1]);
    }

        if (tmp == 0){              //Child A                     
            close(fd[0]);
            dup2(fd[1], 1);
            close(fd[1]);
            execv(mot[0], mot);
    }

    int tmp2 = fork() ;             //FORK B

    if (tmp2 != 0) {                //Parent B
        close(fd[0]);
        while(wait(0) != tmp2) ;
        continue ;
    }

    if (tmp2 == 0){                 //Child B
        close(fd[1]);
        dup2(fd[0], 0);
        close(fd[0]);
        execvp(mot[1], mot);

    }
}

我已经阅读了有关该主题的所有主题,但它不起作用。 你能救我吗?

编辑:第二个代码,我尝试改变结构。

感谢。

1 个答案:

答案 0 :(得分:2)

如果fork成功,则不会达到第二个execvp,因为后者应该替换进程的图像并停止执行当前代码。

你必须重组你的程序。