2015-06-28 3 views
4

Я знаю, что если я вызываю функцию open до fork(), указатель IO разделяется между процессами.Дескрипторы файлов перед fork()

Если один из этих процессов закрывает файл, вызывающий функцию close(fd), будут ли другие процессы по-прежнему способны записывать/читать файл или файл будет закрыт для всех?

+1

Да - дескрипторы файлов и там функция скопирована –

ответ

7

Да. Каждый процесс имеет копию файлового дескриптора (между прочим). Таким образом, один процесс, закрывающий его, не повлияет на копию fd в другом процессе.

От fork() руководства:

Ребенка наследует копию набора родительского открытого файла дескрипторов. Каждый файловый дескриптор в ребёнке ссылается на то же самое описание файла (см. Open (2)) в качестве соответствующего файла дескриптора в родительском. Это означает, что два дескриптора совместно используют флаги состояния открытого файла, текущее смещение файла и сигналы - управляемые атрибуты ввода-вывода (см. Описание F_SETOWN и F_SETSIG в fcntl (2)).

От close() руководства:

Если ФД последний дескриптор файла со ссылкой на подстилающей открытого описания файла (см разомкнут (2)), ресурсы, связанные с описанием открытия файла освобождены ; если дескриптор был последним ссылкой на файл, который был удален с помощью unlink (2), файл удален.

Так что, если вы close(fd); он закрывает только ссылку в этом процессе и другой процесс, удерживающий другую ссылку на тот же дескриптор файла может продолжать работать на нем.

+0

Спасибо, ваш ответ прекрасен! – rickyalbert

2

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