В "Расширенное программирование в среде Unix", второе издание, W. Richard Stevens.
Раздел 8.3 функция fork.
Здесь описание:
Важно, чтобы родительский элемент и дочерний элемент имели одинаковое смещение файла.
Рассмотрим процесс, который разворачивает дочерний элемент, а затем ждет завершения. Предположим, что оба процесса записывают в стандартный вывод как часть их нормальной обработки. Если у родителя есть свой стандартный выход, перенаправленный (возможно, оболочкой), важно, чтобы родительское смещение файла было обновлено дочерним, когда ребенок записывает на стандартный вывод.
[1. Что это значит? если родительский std-вывод перенаправляется на файл 'file1', например, что следует обновлять после записи потомка? родительский исходный сдвиг вывода std или перенаправленный вывод (i.e file1) offset? Не может быть позже, правильно?]
[2. Как производится обновление? через ядро явно, OS неявно, самим дескриптором файлов? После fork я подумал, что родитель и ребенок пошли своими путями и имеют собственную COPY файлового дескриптора. Итак, как ребенок обновляет смещение с родительской стороны?]
В этом случае ребенок может писать стандартный вывод, пока родитель его ждет; по завершении ребенка родитель может продолжить запись на стандартный вывод, зная, что его вывод будет добавлен к тому, что написал ребенок. Если родительский и дочерний объекты не разделяли одно и то же смещение файла, такого типа взаимодействия было бы сложнее выполнить и потребовало бы явных действий родителя.
Если оба родителя и ребенка записываются в один и тот же дескриптор, без какой-либо формы синхронизации, например, если родитель ожидает ожидание дочернего элемента, их вывод будет смешанным (предполагая, что это дескриптор, который был открыт перед fork). Хотя это возможно, это не обычный режим работы.
Существует два нормальных случая для обработки дескрипторов после fork.
-
Родитель ждет, пока ребенок закончит работу. В этом случае родитель не должен ничего делать с дескрипторами. Когда ребенок завершается, любой из общих дескрипторов, которые ребенок читает или пишет, будет соответствующим образом обновлять их файлы.
-
И родитель, и ребенок идут своими путями. Здесь, после fork, родитель закрывает дескрипторы, которые ему не нужны, и ребенок делает то же самое. Таким образом, они не мешают другим открытым дескрипторам. Этот сценарий часто применяется к сетевым серверам.
[3. Когда вызывается fork(), все, что я понимаю, это то, что ребенок получает КОПИЮ того, что имеет родитель, дескриптор файла в этом случае и делает свою вещь. Если какое-либо смещение изменяет файловый дескриптор этого родительского и дочернего долей, это может быть только потому, что дескриптор помнит само смещение. Я прав?]
Извините, что я новичок в концепциях.
Любая помощь? Спасибо.