Многократные перенаправления с 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);

Но он записывает вывод, а затем зацикливается навсегда, и я не понимаю, почему. Одним из решений является сохранение всех команд, а затем не перенаправление вывода для последней, но я хочу выполнить их на месте.

0 ответов

Другие вопросы по тегам