Я не думаю, что вы можете сделать это легко за один путь выполнения. Вам нужен fsync, чтобы гарантировать запись на диск - и это должно будет ждать записи.
Я подозреваю, что это возможно (но не просто), делегировав задачу записи в отдельный поток или процесс. Создайте данные в вашей существующей программе и «запишите» их во второй поток / процесс, используя любой метод, который выглядит разумным. Это может быть неблокирующим. Затем второй поток записывает любые новые данные в данные в ваш файл содержимого, затем fsync, затем записывает файл индекса и снова проверяет наличие новых данных. Ключевые проектные решения касаются того, как вы разделяете два пути выполнения, как вы общаетесь между ними, и если вам нужно сообщить о обратной записи в основную программу. Это может по-прежнему иметь проблемы с задержкой и пропускной способностью, но это часть стоимости выбора синхронизации файла индекса и файла содержимого. По крайней мере, был бы шанс выполнить работу во время ожидания на диске.
Возможно, стоит посмотреть, хорошо ли это инкапсулировано, чтобы быть полезным для вас в источнике любой из транзакционных баз данных. Вы также можете исследовать параметр синхронизации при монтировании файловой системы для файла содержимого.