2013-10-29 11 views
0

我正在使用一个使用qdbm来维护键值存储的程序(将qdbm链接到程序中)。在某些情况下,进程会在qdbm数据库中添加一个值,然后通过调用外部init脚本(通过system())重新启动它自己。看来有时写入qdbm数据库的值实际上并没有粘住,我想知道是否可能是由于在通过SIGTERM终止进程之前数据没有被刷新到磁盘。由于qdbm使用write()系统调用(相对于fwrite()库函数)写入数据,所以我认为Linux内核应该知道最终将所有内容刷新到磁盘(系统不会重新启动,只是过程)。另外,在进程被终止之前,close()在FD上被调用。如果进程被终止,将通过write()写入的数据刷新到磁盘上吗?

所以,我的理解是正确的,或者我需要添加一些fdatasync()或类似的调用在那里的某个地方?此处的权威引用关于语义的链接也将被赞赏。

+0

https://www.gnu.org/software/libc/manual/html_node/Termination-Internals.html#Termination-Internals是您想要的权威参考吗?引用:*请注意,流程终止时不会自动刷新流;请参阅Streams上的I/O * –

回答

0

通常情况下,已经写的应用程序到内核缓冲区write()的数据将不会被应用程序退出或以任何方式被杀的影响。退出或获取杀死隐式关闭所有文件描述符,所以应该没有区别,内核将在之后处理刷新。所以没有fdatasync()或类似的电话是必要的。

有两个例外:

  • 如果应用程序使用用户级缓冲(不调用write()系统调用,而是缓存中的数据在用户空间的缓冲区,以fwrite())那些缓冲区可能不会被刷新,除非执行了适当的用户空间文件关闭 - 被SIGKILL杀死肯定会导致您丢失那些缓冲区的内容,如果内核也死掉(功耗,内核崩溃等),您的数据可能错过了写入t o内核缓冲区中的磁盘,然后会丢失。

+0

我真的希望获得权威的参考,但我想我必须采取我能得到的结果。 – jjlin

相关问题