Как устроено перенаправление потоков данных?

Я пишу свой командный интерпретатор на C наподобие bash. И возник вопрос: "Как bash перенаправляет потоки?". Я искал где только мог, но кроме инструкций по применению этой возможности я ничего не нашёл.


Ответы (1 шт):

Автор решения: Pavel Borzenkov

Для того, чтобы понять как работает перенаправление потоков, нужно помнить всего одну вещь: программа, запущенная с помощью exec(2), наследует открытые файловые дескрипторы процесса, вызвавшего exec(2).

Далее все просто. Допустим вы хотите перенаправить stdout какой-то утилиты в файл, например вот так:

$ ls > output

В вашем интерпретаторе для этого вы делаете вот так (псевдокод):

pid = fork()
if (!pid) { // child
  fd = open("output")
  dup2(fd, STDOUT_FILENO)
  exec("ls")
}

Для создания пайпа (|) используется аналогичный подход с той лишь разницей, что создается два процесса и у одного заменяет stdin, а у другого - stdout, на файловые дескрипторы, которые возвращает системный вызов pipe(2).

→ Ссылка