Основных соответствующие строки таковы - они образуют стандартную идиому (но легче заменить первые две линии на dup2(fd[1], 1)
):
close(1);
dup(fd[1]);
close(fd[0]);
close(fd[1]);
Функция dup()
дублирует дескриптор файла аргумента в дескриптор нераспечатанного файла с наименьшим номером. close()
закрывает дескриптор 1
, а дескриптор 0
все еще открыт, поэтому dup()
делает стандартный вывод 1
со ссылкой на сторону записи трубки fd[1]
. Два других близких вызова правильно закрывают оба конца трубы. Процесс не должен считываться из считываемого конца трубки fd[0]
, и стандартный вывод записывается на конец записи в трубку, чтобы другой дескриптор больше не нужен (и может привести к проблемам, если он не был закрыт).
Итак, это стандартная последовательность для соединения конца записи трубы с стандартным выходом процесса. Вторая последовательность похожа, но соединяет считываемый конец трубы со стандартным входом (вместо конца записи на стандартный вывод).
Как правило, при подключении одного конца трубы к стандартному входу или к стандартному выходу, процесс должен закрывать как концами исходной трубы.
Я отмечаю, что проверки ошибок не было, хотя маловероятно, что что-то пойдет не так - если процесс не был начат ни с стандартного вывода, ни со стандартного ввода, вопреки всем разумным ожиданиям.
Да, это точно. «Закрыть (1); dup (fd [1]); 'последовательность эквивалентна' dup2 (fd [1], 1): '. –