我正在使用一个使用qdbm来维护键值存储的程序(qdbm链接到程序中)。在某些情况下,进程会在qdbm数据库中放入一个值,然后通过调用外部init脚本(通过system())重新启动自身。似乎有时写入qdbm数据库的值实际上并没有坚持,我想知道是否可能是因为在通过SIGTERM终止进程之前数据没有被刷新到磁盘。
由于qdbm使用write()系统调用(比如fwrite()库函数)进行写入,我认为Linux内核应该知道最终将所有内容刷新到磁盘(系统不会重新启动,只是过程)。此外,在进程被终止之前,会在FD上调用close()。
那么,我的理解是正确的,还是我需要在某处添加一些fdatasync()或类似的调用?此处有关语义的权威参考资料的链接也将受到赞赏。
答案 0 :(得分:0)
通常,应用程序已经使用write()
写入内核缓冲区的数据不会受到以任何方式退出或被杀死的应用程序的影响。退出或被杀死隐式关闭所有文件描述符,因此应该没有区别,内核将在之后处理刷新。因此,不需要fdatasync()
或类似的电话。
这有两个例外:
如果应用程序使用用户域缓冲(不调用write()
系统调用,而是使用fwrite()
将数据缓存在用户空间缓冲区中),那些缓冲区可能不会除非执行正确的用户空间文件关闭,否则将被刷新 - 被SIGKILL杀死肯定会导致丢失这些缓冲区的内容,
如果内核死掉(断电,内核崩溃等),您的数据可能会错过从内核缓冲区写入磁盘,然后就会丢失。
< / LI>