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
那么您不需要信号处理程序。
我的程序中有一个无限循环,它将写入一个定义为 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
那么您不需要信号处理程序。