Как устроено перенаправление потоков данных?
Я пишу свой командный интерпретатор на C наподобие bash. И возник вопрос: "Как bash перенаправляет потоки?". Я искал где только мог, но кроме инструкций по применению этой возможности я ничего не нашёл.
Ответы (1 шт):
Для того, чтобы понять как работает перенаправление потоков, нужно помнить всего одну вещь: программа, запущенная с помощью 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).