kill命令后

时间:2016-10-10 10:17:21

标签: c linux io flush kill-process

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

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

我可以使用信号,比如

signal(SIGTERM, close(filename));

但我如何处理所有杀戮信号?

2 个答案:

答案 0 :(得分:2)

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

由于您在信号处理程序中想要做的事情中提到了close,因此您似乎没有缓冲写入,因此您无需执行任何操作。成功调用write后写入的数据将最终出现在文件中,除非您的计算机崩溃(或者您的磁盘/文件系统在刷新缓冲区缓存之前中断,请不要担心)。事实上,在程序中返回write的那一刻,数据可以被认为是写入文件中的,并且可以被读取该文件的其他进程看到(例外情况是机器崩溃或者文件系统边缘很少)案例,但这是一个更复杂的话题。)

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

答案 1 :(得分:0)

您可以在某些预定义的时间间隔内强制刷新循环中的数据。您可以使用

int fsync(int fd);

int fdatasync(int fd);

fsync会将文件从内核缓冲区刷新到磁盘。除元数据外,fdatasync也会这样做。