Estou lidando com uma situação em que desejo salvar o estado de forma persistente para um aplicativo que possui muitos processos e muitos threads nesses processos. Normalmente, isso exigiria um uso intenso de bloqueio para garantir que não haja conflitos.
Desejo evitar isso salvando os dados em um arquivo com o modo O_APPEND. Dessa forma, desde que eu garanta que os dados sejam <4KiB, as gravações no arquivo serão atômicas. Se eu usar apenas estruturas de dados anexados, terei uma solução sem bloqueios.
No entanto, para que isso funcione, preciso saber a localização dos dados no arquivo depois de gravar nesse arquivo. O problema que estou enfrentando é que não consigo encontrar uma chamada de sistema que grava em um arquivo e depois me informa o deslocamento nesse arquivo em que foi gravado.
Posso usar uma escrita seguida de uma busca para descobrir este local. No entanto, isso não é seguro se outro thread estiver compartilhando o mesmo descritor de arquivo, portanto, seria necessário proteger a gravação com um mutex, o que vai contra meus esforços para evitar bloqueios.
Examinar as páginas de manual para write, writev, pwrite e prwritev não mostrou nada que pudesse realizar uma gravação e, em seguida, me diga o deslocamento após a gravação como uma única chamada de sistema e estou plenamente ciente de que pode não haver. Eu olhei alguma coisa?