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

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

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

Ответ 1

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

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

Ответ 2

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

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

Ответ 3

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

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