Атомарные запись и передача для файлов в режиме O_APPEND на Linux

Атомарные запись и передача для файлов в режиме O_APPEND на Linux

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

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

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

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

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

Связанный контент