pwrite после дуп гонки безопасен? - PullRequest
2 голосов
/ 03 декабря 2009

В Linux операция pwrite (то есть поиск + запись) является атомарной, что означает, что выполнение pwrite-s в нескольких потоках с одним файловым дескриптором безопасно. Я хочу создать дубликат дескриптора файла, используя dup (). Теперь, имея fd1 и fd2 - pwrite-s будет работать так, как ожидалось, или существует опасность состояния гонки?

Ответы [ 2 ]

5 голосов
/ 03 декабря 2009

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

Со страницы руководства:

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

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

1 голос
/ 03 декабря 2009

Я думаю, что pwrite является атомарной операцией , если число байтов, которые вы пишете, меньше, чем PIPE_BUF канала, в который вы пишете (из руководства программиста POSIX ) .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...