Может ли кто-нибудь объяснить простое описание «файлового дескриптора» после fork ()?

В «Расширенном программировании в среде Unix», 2-е издание, У. Ричард Стивенс.

Раздел 8.3 функция форка.

Вот описание:

Важно, чтобы родительский и дочерний файлы имели одинаковое смещение в файле.

Рассмотрим процесс, который разветвляет дочерний процесс, а затем ожидает завершения дочернего процесса. Предположим, что оба процесса выполняют запись в стандартный вывод как часть своей обычной обработки. Если стандартный вывод родителя перенаправляется (оболочкой, возможно, )важно, чтобы смещение родительского файла обновлялось дочерним элементом, когда дочерний элемент записывает в стандартный вывод.

[1. Что это означает? если вывод родителя std перенаправляется, например, в «file1», то что должен обновить дочерний элемент после записи дочернего элемента? исходное стандартное выходное смещение родителя или перенаправленный вывод (, т.е. смещение file1 )? Не может быть позже, верно?]

[2. Как делается обновление? явно дочерним, неявно ОС, самим дескриптором файлов? После разветвления я подумал, что родитель и ребенок пошли своим путем и имеют свою собственную КОПИЮ файлового дескриптора. Итак, как дочернее обновление смещается на родительскую сторону?]

В этом случае потомок может писать в стандартный вывод, пока родитель его ждет; по завершении дочернего процесса родитель может продолжить запись в стандартный вывод, зная, что его вывод будет добавлен ко всему, что написал дочерний элемент. Если бы родительский и дочерний элементы не использовали одно и то же смещение в файле, этот тип взаимодействия было бы труднее выполнить и потребовало бы явных действий со стороны родителя.

Если и родитель, и потомок пишут в один и тот же дескриптор без какой-либо формы синхронизации, например, когда родитель ожидает дочерний элемент, их выходные данные будут смешаны (, предполагая, что это дескриптор, который был открыт до ответвления ). Хотя это возможно, это не нормальный режим работы.

Есть два обычных случая обработки дескрипторов после разветвления.

  1. Родитель ждет, пока ребенок закончит. В этом случае родителю не нужно ничего делать со своими дескрипторами. Когда дочерний процесс завершится, для любого из общих дескрипторов, из которых дочерний процесс читал или записывал, будет соответствующим образом обновлено их файловое смещение.

  2. И родитель, и ребенок идут своим путем. Здесь после форка родитель закрывает ненужные ему дескрипторы, и то же самое делает дочерний элемент. Таким образом, ни один из них не мешает другим открытым дескрипторам. Этот сценарий часто имеет место с сетевыми серверами."

[3. Когда вызывается fork (), все, что я понимаю, это то, что ребенок получает КОПИЮ того, что есть у родителя, в данном случае файлового дескриптора, и делает свое дело. Если какое-либо смещение изменяется в файловом дескрипторе, который совместно используется родителем и дочерним элементом, это может быть только потому, что дескриптор запоминает само смещение. Я прав?]

Извините, я новичок в понятиях.

Любая помощь? Спасибо.

33
задан Jens 31 July 2012 в 07:06
поделиться