Атомарная запись и передача файлов в режиме O_APPEND в Linux - PullRequest
0 голосов
/ 28 мая 2019

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

Я хочу избежать этого, сохранив данные в файл в режиме O_APPEND. Таким образом, при условии, что данные <4 КБ, запись в файл будет атомарной. Если я использую добавление только структур данных, то у меня есть решение без блокировки. </p>

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

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

Изучение man-страниц для write, writev, pwrite и prwritev не показало ничего, что могло бы выполнить запись, а затем сообщило мне смещение после записи как один системный вызов, и я полностью осознаю, что , Я что-то посмотрел?

1 Ответ

0 голосов
/ 29 мая 2019

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

Когда код вызывает write для обычного файла, первое, что делает ядро, это получает семафор чтения-записи файла. Все ваши потоки записи сериализуются в этом семафоре в ядре.

См. vfs_write, он вызывает file_start_write, который в конечном итоге приобретает семафор.

...