2017-02-07 4 views
0

В C/C++ вы читаете stdout из подпроцесса через dup2 (..., STDERR_FILENO) [1]. Я действительно не понимаю, что делает dup2; могу ли я сделать это дважды для двух подпроцессов, которые работают одновременно? Я вижу проблему с моей существующей реализацией, когда один из них не может завершить чтение STDERR, и мне интересно, является ли это ошибкой реализации или просто невозможно.Можно ли перенаправить stdout для двух подпроцессов?

Редактировать: Они созданы отдельными темами. Запуск и остановка могут чередоваться.

[1] например. например Linux 3.0: Executing child process with piped stdin/stdout

ответ

3

Подумайте о файловом дескрипторе как рефлектованном/умном косвенном указателе на поддерживаемый ядром объект. dup (dup2, dup3) дублирует интеллектуальный «указатель», увеличивая коэффициент обновления файлового объекта, поддерживаемый ядром. close уменьшает стоимость пересчета и уничтожает поддерживаемый ядром файл-файл, если refcount становится 0.

Эти файловые объекты могут совместно использоваться несколькими процессами, которые обычно случается, когда процесс fork S (A fork также увеличивает на refcounts файла объектов, на которую указывает унаследованных filedescriptors (и так же послав дескриптор файла через UNIX разъем)).

(Сохраняя эту модель в виду, что особенно важно, когда вы имеете дело с pipe дескрипторов файлов дублируется fork Инг, потому что прочитать конец трубы, будет получить только EOF, когда все ее концы записи (во всех процессах, которые имеют ФО ссылкой к этому концу записи) были закрыты.)

+0

Таким образом, оба процесса записывались в один и тот же дескриптор файла? Итак, как родитель объясняет разницу между тем, из какого процесса поступают данные? –

+1

@JohandeVries, если вы не напечатаете идентификатор дочернего процесса, нет способа узнать, какой процесс написал на него. –

+0

Последующий вопрос: http://stackoverflow.com/questions/42117551/race-condition-in-starting-up-sub-processes-causes-reading-from-pipe-to-hang –

Смежные вопросы