1

我正在使用一个使用qdbm来维护键值存储的程序(qdbm 链接到程序中)。在某些情况下,该进程将一个值放入 qdbm 数据库,然后通过调用外部初始化脚本(通过 system())重新启动自身。似乎有时写入 qdbm 数据库的值实际上并没有保持不变,我想知道这是否可能是由于在通过 SIGTERM 终止进程之前数据没有刷新到磁盘。

由于 qdbm 使用 write() 系统调用(相对于 fwrite() 库函数)进行写入,我认为 Linux 内核应该知道最终将所有内容刷新到磁盘(系统不会重新启动,只是进程)。此外,在进程被杀死之前,在 FD 上确实会调用 close()。

那么,我的理解是否正确,或者我是否需要在某处添加一些 fdatasync() 或类似的调用?此处还可以链接到有关语义的权威参考资料。

4

1 回答 1

0

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

这有两个例外:

  • 如果应用程序使用用户空间缓冲(不调用write()系统调用,而是将数据缓存在用户空间缓冲区中,使用fwrite()),除非执行适当的用户空间文件关闭,否则这些缓冲区可能不会被刷新 - 被杀死SIGKILL 肯定会导致您丢失这些缓冲区的内容,

  • 如果内核也死了(断电、内核崩溃等),您的数据可能会错过从内核缓冲区写入磁盘的过程,然后就会丢失。

于 2013-10-29T03:18:13.473 回答