Многократные перенаправления с dup и dup2
Я реализую некоторые части оболочки. Одним из них является труба. Во время синтаксического анализа я исполняю команды, перенаправляя их ввод / вывод с помощью dup2. В частности, я делаю следующее (я не пишу здесь проверку ошибок для простоты, но я проверяю ошибки в своем коде). Перед началом разбора у меня есть
int p[2];
pipe(p);
int stdin_copy = dup(0);
int stdout_copy = dup(1);
Выполнение команды:
dup2(p[1], 1);
// exec command with fork and execvp - it's all ok with this part
dup2(p[0], 0); // placed after exec in order to prevent redirect for first command
// in pipe
Когда канал обрабатывается, выводится последняя команда в p
поэтому я пытаюсь записать его на стандартный вывод:
dup2(stdout_copy, 1);
dup2(stdin_copy, 0); // restore original stdin/stdout
char c;
while (read(p[0], &c, sizeof(char)) > 0)
printf("%c", c);
Но он записывает вывод, а затем зацикливается навсегда, и я не понимаю, почему. Одним из решений является сохранение всех команд, а затем не перенаправление вывода для последней, но я хочу выполнить их на месте.