два файловых дескриптора в одном файле - PullRequest
14 голосов
/ 12 марта 2011

Используя вызовы posix read () write () linux, гарантируется ли, что если я записываю через один файловый дескриптор и читаю через другой файловый дескриптор, последовательно, так что эти два действия взаимно исключают друг друга ... ... что мой дескриптор файла чтения всегда будет видеть, что было написано последним дескриптором файла записи?

Я верю, что это так, но я хочу убедиться, что справочная страница не очень помогает в этом

Ответы [ 3 ]

22 голосов
/ 12 марта 2011

Это зависит от того, где вы получили два файловых дескриптора. Если они приходят из вызова dup (2), то они совместно используют смещение и статус файла, поэтому выполнение write (2) для одного из них повлияет на положение другого. С другой стороны, если они поступают из двух отдельных вызовов open (2), каждый из них будет иметь собственное смещение и статус файла.

Файловый дескриптор - это в основном просто ссылка на файловую структуру ядра, и именно эта структура ядра содержит большую часть состояния. Когда вы открываете (2) файл, вы получаете новую файловую структуру ядра и новый дескриптор файла, который ссылается на него. Когда вы дублируете (2) дескриптор файла (или передаете дескриптор файла через sendmsg), вы получаете новую ссылку на ту же структуру файла ядра.

1 голос
/ 12 марта 2011

Это гарантируется, если они оба ссылаются на одно и то же описание файла, то есть вы получили их от «dup» или «dup2» (или унаследовали через fork()).

После успешного возвратаиз одного из этих системных вызовов старые и новые файловые дескрипторы могут использоваться взаимозаменяемо.Они ссылаются на одно и то же описание открытого файла (см. Open (2)) и, таким образом, совместно используют смещение файла и флаги состояния файла;например, если смещение файла изменяется с помощью lseek (2) для одного из дескрипторов, смещение также изменяется для другого.

0 голосов
/ 07 сентября 2013

при использовании dup() или dup2() или fork(), таблица файлов используется обоими дескрипторами файлов. так что если вы write что-то из одного файлового дескриптора, и снова write что-то через другой файловый дескриптор, то это добавляется, а не перезаписывается.

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

...