关闭文件描述符时如何防止数据丢失?

时间:2016-11-21 16:44:59

标签: c linux data-loss fsync

当我发出write()时,我的数据会转到某些内核空间缓冲区。物理层的实际提交(" phy-commit")(可能)延迟,直到..(确切地说直到什么事件?)

当我为文件描述符发出close()时,

  

如果[...],则释放与打开文件描述相关联的资源

是否意味着释放(释放)包含我的数据的内核缓冲区?我的宝贵数据会包含在这些缓冲区中会发生什么?会丢失吗?

如何防止这种损失?

通过fsync()?它要求明确的phy-commit。我想是立即(同步通话)或仅延迟"短时间内#34;排队等候后续行动,至少是破坏性行动。

但我不太希望立即或紧急的phy-commit。只有(保留我的数据)不要忘记稍后再进行phy-commit。


来自man fclose

  

fclose()函数[...]关闭底层文件描述符   ...
  fclose()仅刷新C库提供的用户空间缓冲区。为了确保数据物理存储在磁盘上,必须刷新内核缓冲区,例如,使用sync(2)或fsync(2)。

可能会建议fsync不必先于 close(或fclose,其中包含close),但可以(甚至不得不追求它。所以close()不能具有很大的破坏性......

1 个答案:

答案 0 :(得分:1)

  

是否意味着释放(释放)包含我的数据的内核缓冲区?我的宝贵数据会包含在这些缓冲区中会发生什么?会丢失吗?

没有。在将数据写入基础文件之前,不会释放内核缓冲区。因此,不会有任何数据丢失(除非出现问题 - 例如系统停电)。 是否将数据立即写入物理文件是另一个问题。它可能依赖于文件系统(可能是缓冲)和/或任何硬件缓存。 就您的用户程序而言,成功的close()调用可被视为成功写入文件。

  

它可能表明fsync不必在close(或fclose,包含close)之前,但可以(甚至必须)在它之后。所以close()不能具有很大的破坏性......

在调用close()之后,POSIX未指定文件描述符的状态(无论close()是否成功)。因此,在调用fsync(fd);之后,您不能使用close() 。 请参阅:POSIX/UNIX: How to reliably close a file descriptor

不,它并不表明close()可能具有破坏性。它表明C库可能在用户中进行自己的缓冲,并建议使用fsync()将其刷新到内核(现在,我们处于与之前相同的位置)。