2016-09-30 19 views
0

Я хотел создать дочерний процесс, который разворачивает дважды, чтобы создать два дочерних процесса. С выходом одного отправляется другому. Я нашел этот пример кода. Но я смущен тем, как это работает.Как этот пример использует работу dup?

Я нашел номер example here. Но я смущен тем, как используется dup и как он работает.

т.е.

close(1); 
dup(fd[1]); 
close(fd[0]); 
close(fd[1]); 

Выход затем поступает во второй раздвоенный процесс, и это трубы соединены так:

close(0); 
dup(fd[0]); 
close(fd[0]); 
close(fd[1]); 
+1

Да, это точно. «Закрыть (1); dup (fd [1]); 'последовательность эквивалентна' dup2 (fd [1], 1): '. –

ответ

2

Основных соответствующие строки таковы - они образуют стандартную идиому (но легче заменить первые две линии на 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], и стандартный вывод записывается на конец записи в трубку, чтобы другой дескриптор больше не нужен (и может привести к проблемам, если он не был закрыт).

Итак, это стандартная последовательность для соединения конца записи трубы с стандартным выходом процесса. Вторая последовательность похожа, но соединяет считываемый конец трубы со стандартным входом (вместо конца записи на стандартный вывод).

Как правило, при подключении одного конца трубы к стандартному входу или к стандартному выходу, процесс должен закрывать как концами исходной трубы.

Я отмечаю, что проверки ошибок не было, хотя маловероятно, что что-то пойдет не так - если процесс не был начат ни с стандартного вывода, ни со стандартного ввода, вопреки всем разумным ожиданиям.