Я пытаюсь разработать простую симуляцию оболочки 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;
}
}