Pipe () fork () и exec - PullRequest
       25

Pipe () fork () и exec

1 голос
/ 03 июня 2011

Я пытаюсь добавить трубу в мини-оболочку. Я запутался, когда набираю 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 Ответ

2 голосов
/ 03 июня 2011

Второй fork не будет достигнут в случае успеха execvp, поскольку последний должен заменить образ процесса и прекратит выполнение текущего кода.

Вы должны реструктурировать свою программу.

...