С сантехникой нужно быть очень осторожным:
- Вызовите pipe () дважды, один для канала «потомок», другой для «канал от потомка», получая 4 файловых дескриптора.
- Вызовите fork ().
- у ребенка:
- Вызовите close () для стандартного ввода (дескриптор файла 0).
- Вызовите dup () - или dup2 () - чтобы преобразовать конец канала «потомок» в стандартный ввод.
- Вызовите close () в конце чтения канала для потомка.
- Вызовите close () в конце записи канала для потомка.
- Вызовите close () для стандартного вывода (дескриптор файла 1).
- Вызовите dup () - или dup2 () - чтобы сделать конец записи канала-потомка в стандартный вывод
- Вызовите close () для конца записи канала от ребенка.
- Вызовите close () для конца чтения канала от ребенка.
- Выполнить требуемую программу.
- у родителей:
- Вызовите close в конце чтения канала для потомка.
- Вызовите close в конце записи для pipe-of-child.
- Цикл отправки данных дочернему элементу в конце записи pipe-to-child и чтение данных от дочернего элемента в конце read of pipe-to-child
- Если больше нет необходимости отправлять дочернему элементу, закройте конец записи "pipe-to-child".
- Когда все данные будут получены, закройте конец чтения канала «от ребенка».
Обратите внимание, сколько закрытий, особенно у ребенка. Если вы используете dup2 (), вам не нужно явно закрывать стандартный ввод и вывод; однако dup () работает правильно, если вы делаете явное закрытие. Также обратите внимание, что ни dup (), ни dup2 () не закрывают файловый дескриптор, который дублируется. Если вы пропустите закрытие каналов, то ни одна из программ не сможет правильно определить EOF; тот факт, что текущий процесс все еще может записывать в канал, означает, что в канале нет EOF, и программа будет зависать бесконечно.
Обратите внимание, что это решение не изменяет стандартную ошибку для ребенка; он идет в то же место, что и стандартная ошибка для родителя. Часто это правильно. Если у вас есть конкретное требование, чтобы сообщения об ошибках от ребенка обрабатывались по-другому, то примите соответствующие меры и к стандартной ошибке ребенка.