два файловых дескриптора в один файл

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

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

3 ответов


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

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


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

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


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

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