C / C ++ fork (), pipe () и execvp () вопрос - PullRequest
0 голосов
/ 05 октября 2019

Я пытаюсь разработать простую симуляцию оболочки Unix. Часть, на которой, я думаю, я сейчас застрял, это понимание того, как работает execvp. Я пытался провести какое-то исследование, но без особой удачи.

В основном я делаю дочерний процесс с fork() и конвейером. Я перенаправляю STDOUT на запись моего канала fd. И, наконец, я звоню своему execvp из моего дочернего процесса. Мой execvp() вызов - это просто программа, которая выводит простую строку.

Затем я пытаюсь прочитать эту строку из родителя и использовать ее в качестве входных данных для моей второй execvp() программы. Эта программа просто выводит все, что читает.

Проблема, с которой я сталкиваюсь, заключается в том, что моя первая программа вызывается из execvp(), а затем она просто выводит строку прямо в терминал.

Полагаю, мой вопрос в том, была ли программа, выполненная с execvp(), не содержит STDOUT (конец записи моего канала) программы, в которой была создана? И если нет, как бы я заставил это написать в мой канал вместо терминала? Могу ли я поместить свой execvp в вызов записи?

else if(commandLine[i] == "|"){ 
            pid_t pid2;
            pid2 = fork();
            t = i;
            if (pid2 == 0){ // in child of child 
                close(pipe1fd[0]);
                dup2(pipe1fd[1], STDOUT_FILENO);
                execvp(commandLine[i-1], commandLine);
            }
            else{
                close(pipe1fd[1]);
                dup2(pipe1fd[0], STDIN_FILENO);
                wait(0);
                execvp(commandLine[i+1], commandLine);
                goto BACK;
            }
        }
...