У меня есть база данных в C, для которой мне нужно сделать атоми c обновления. В частности, это файл, который хранится следующим образом:
header: MAX_USERS/8 bytes
users: MAX_USERS*sizeof(USER) bytes
Файл усечен , потому что он действительно разреженный и имеет большую емкость.
Когда база данных открыта, я прочитать весь заголовок в память, но ни один из пользователей.
Когда приходит запрос на создание пользователя, я хотел бы сделать это:
// modify header in memory
// initialize user
// atomically: write header and user to disk
Единственные флаги, которые я можно найти для файлового ввода / вывода, относящегося к этому, O_SYN C и O_DSYN C, но они делают то, что мне нужно, и fwrite
вызывает атомы c. Что мне действительно нужно, так это:
// somehow, make file only write to disk when fflush is called
// write header to disk (fseek/fwrite)
// write user to disk (fseek/fwrite)
// if both of those succeeded: fflush/fsync
Мне интересно, можно ли это сделать, явно предоставив буфер пространства пользователя для файла через что-то вроде setvbuf
с _IOFBF
, но я не знаю, сработает ли это.