![Атомарные запись и передача для файлов в режиме O_APPEND на Linux](https://rvso.com/image/154444/%D0%90%D1%82%D0%BE%D0%BC%D0%B0%D1%80%D0%BD%D1%8B%D0%B5%20%D0%B7%D0%B0%D0%BF%D0%B8%D1%81%D1%8C%20%D0%B8%20%D0%BF%D0%B5%D1%80%D0%B5%D0%B4%D0%B0%D1%87%D0%B0%20%D0%B4%D0%BB%D1%8F%20%D1%84%D0%B0%D0%B9%D0%BB%D0%BE%D0%B2%20%D0%B2%20%D1%80%D0%B5%D0%B6%D0%B8%D0%BC%D0%B5%20O_APPEND%20%D0%BD%D0%B0%20Linux.png)
Я имею дело с ситуацией, когда я хочу сохранять состояние постоянно для приложения, которое имеет много процессов и много потоков внутри этих процессов. Обычно это требует интенсивного использования блокировки, чтобы гарантировать отсутствие конфликтов.
Я хочу избежать этого, сохраняя данные в файл с режимом O_APPEND. Таким образом, пока я гарантирую, что данные <4KiB, записи в файл будут атомарными. Если я использую структуры данных только для добавления, то у меня есть решение без блокировки.
Однако, чтобы это работало, мне нужно знать местоположение данных в файле после того, как я записал в этот файл. Проблема, с которой я сталкиваюсь, заключается в том, что я не могу найти системный вызов, который записывает в файл, а затем сообщает мне смещение внутри этого файла, в который была сделана запись.
Я могу использовать запись, за которой следует поиск, чтобы обнаружить это местоположение. Однако это небезопасно, если другой поток использует тот же дескриптор файла, поэтому мне потребуется защитить запись с помощью мьютекса, что противоречит моим усилиям по избежанию блокировок.
Изучение страниц man для write, writev, pwrite и prwritev не показало ничего, что могло бы выполнить запись, а затем сообщить мне смещение после записи как единый системный вызов, и я полностью осознаю, что этого может и не быть. Я что-то упустил из виду?