我有一个C语言数据库,需要对其进行原子更新。具体来说,就是这样存储的文件
header: MAX_USERS/8 bytes
users: MAX_USERS*sizeof(USER) bytes
该文件为truncated,因为它确实稀疏且容量很大。
打开数据库时,我将整个标头读入内存,但没有一个用户。
在创建用户请求时,我想这样做:
// modify header in memory
// initialize user
// atomically: write header and user to disk
我可以找到的与此文件I / O相关的唯一标志是O_SYNC和O_DSYNC,但它们与我想要的相反,从而强制fwrite
调用是原子的。我真正想要的是这样的东西:
// 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
之类的文件为文件显式提供用户空间缓冲区来实现,但是我不知道这样做是否可行。