应该在每次 fclose 之后使用 fsync 吗?

mic*_*ael 2 c linux file stdio

在 Linux(Ubuntu 平台)设备上,我使用一个文件来保存关键任务数据。

有时(大约 10,000 个案例中发生一次),文件会因不明原因而损坏。特别是,文件被截断(而不是一些 kbyte,它只有大约 100 个字节)。

现在,按照软件的顺序

  1. 文件被打开,
  2. 修改和
  3. 关闭。

紧接着,文件可能会再次打开 (4),并且正在执行其他操作。

到目前为止,我还没有注意到fflush(被调用fclose)不会写入文件系统,而只会写入中间缓冲区。可能是因为 3) 和 4) 之间的时间太短,并且 2) 的更改尚未写入磁盘,所以当我用 4) 重新打开时,我得到一个截断的文件,当它再次关闭时会导致永久丢失那些数据?

fsync()在这种情况下我应该在每次文件写入后使用吗?

停电需要考虑什么?数据损坏不太可能与断电有关。

Wer*_*nze 6

fwrite有时写入到内部缓冲器中的第一,然后(在fflushfclose或当缓冲器满)调用OS功能write

操作系统也在做一些缓冲,写入设备可能会延迟。

fsync 确保操作系统正在将其缓冲区写入设备。

在您打开-写入-关闭的情况下,您不需要fsync. 操作系统知道文件的哪些部分尚未写入设备。因此,如果第二个进程想要读取文件,操作系统知道它在内存中有文件内容,并且不会从设备读取文件内容。

当然,在考虑停电时,最好(取决于具体情况)fsync确保将文件内容写入设备(正如 Andrew 指出的那样,这并不一定意味着将内容写入磁盘) ,因为设备本身可能会进行缓冲)。

  • *`fsync` 以确保将文件内容写入磁盘。* 但这仅意味着磁盘 *设备*(无论它是什么 - RAID 控制器或实际磁盘)已接受数据。这并不意味着数据是安全存储的——磁盘设备也在内存中缓存数据。 (3认同)