我的程序中有一个无限循环,它会在定义为stdout的文件中写入,直到我将其删除。因此,该文件永远不会被关闭,也不会包含所写的内容。
有没有办法在kill命令后关闭文件?
我可以使用信号,比如
signal(SIGTERM, close(filename));
但我如何处理所有杀戮信号?
答案 0 :(得分:2)
您的问题标记为“linux”,因此除非您缓冲写入并且不刷新缓冲区(例如,当使用fwrite
时,您需要有时调用fflush
),内容将是写入文件,因为它将在退出时正确关闭(即使退出是由信号强制)。你不需要fsync
,除非你正在做一些必须在机器崩溃中幸存的事情(然后你需要知道你正在采取什么行动才能使崩溃语义正确)。
由于您在信号处理程序中想要做的事情中提到了close
,因此您似乎没有缓冲写入,因此您无需执行任何操作。成功调用write
后写入的数据将最终出现在文件中,除非您的计算机崩溃(或者您的磁盘/文件系统在刷新缓冲区缓存之前中断,请不要担心)。事实上,在程序中返回write
的那一刻,数据可以被认为是写入文件中的,并且可以被读取该文件的其他进程看到(例外情况是机器崩溃或者文件系统边缘很少)案例,但这是一个更复杂的话题。)
如果您在信号处理程序中所做的只是close
文件描述符和_exit
那么您就不需要信号处理程序。
答案 1 :(得分:0)
您可以在某些预定义的时间间隔内强制刷新循环中的数据。您可以使用
int fsync(int fd);
或
int fdatasync(int fd);
fsync会将文件从内核缓冲区刷新到磁盘。除元数据外,fdatasync也会这样做。