当我发出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()
不能具有很大的破坏性......
答案 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()
将其刷新到内核(现在,我们处于与之前相同的位置)。