kill 命令后关闭文件

Close file after a kill command

我的程序中有一个无限循环,它将写入一个定义为 stdout 的文件,直到我终止它。因此,该文件永远不会关闭,也不会包含写入的内容。

有没有办法在 kill 命令后关闭文件?

我可以使用信号,比如

signal(SIGTERM, close(filename));

但是我将如何处理所有终止信号?

您可以在某些预定义的 intervals.You 上强制刷新循环内的数据,可以使用

int fsync(int fd);

int fdatasync(int fd);

fsync 会将文件从内核缓冲区刷新到磁盘。 fdatasync 也可以,除了元数据。

你的问题被标记为 "linux",所以除非你缓冲你的写入并且不刷新缓冲区(例如,当使用 fwrite 时,你有时需要调用 fflush),内容将被写入文件,因为它会在退出时正确关闭(即使退出是由信号强制的)。你不需要 fsync 除非你正在做一些必须在机器崩溃后幸存下来的事情(然后你需要知道你在做什么才能正确获得崩溃语义)。

由于您在信号处理程序中想要执行的操作中提到了 close,因此您似乎并未缓冲写入,因此您无需执行任何操作。成功调用 write 写入的数据将最终保存在文件中,除非您的机器崩溃(或者您的 disk/filesystems 在刷新缓冲区缓存之前中断,不用担心)。事实上,在你的程序中 write returns 的那一刻,数据可以被认为写入文件并且将被读取该文件的其他进程可见(如果机器崩溃或一些文件系统边缘情况,但这是一个复杂得多的主题)。

如果您在信号处理程序中所做的只是 close 您的文件描述符和 _exit 那么您不需要信号处理程序。