【发布时间】:2016-11-21 16:44:58
【问题描述】:
当我发出write() 时,我的数据会进入一些内核空间缓冲区。对物理层的实际提交(“phy-commit”)(可能)被推迟,直到..(到底是什么事件?)
当我为文件描述符发出close() 时,然后
如果 [...],则释放与打开文件描述相关的资源
这是否意味着释放(释放)那些包含我的数据的内核缓冲区?这些缓冲区中包含的宝贵数据会怎样?会丢失吗?
如何防止这种损失?
通过fsync()?它请求一个明确的 phy-commit。我想要么立即(同步调用),要么仅“短时间”推迟并排队等待后续操作,至少是破坏性操作。
但我不太想要立即或紧急的 phy-commit。只是(保留我的数据并且)不要忘记稍后再做 phy-commit。
来自man fclose:
fclose() 函数 [...] 关闭底层文件描述符。
...
fclose() 仅刷新 C 库提供的用户空间缓冲区。为确保数据物理存储在磁盘上,内核缓冲区也必须刷新,例如使用 sync(2) 或 fsync(2)。
这可能表明fsync 不必先于 close(或fclose,其中包含close),但可以(甚至必须)在它之后。所以close() 不会有很大的破坏性...
【问题讨论】:
-
close 和 fclose 足以让数据到达磁盘,除非在接下来的几毫秒内出现物理断开或断电等情况。
-
内核在实际提交数据之前不会释放其缓冲区。你不需要做任何事情。