我在手册页中读到,当调用exit()
时,所有流都会被刷新并自动关闭。起初我对这是如何完成以及它是否真的可靠而持怀疑态度,但看到我再也找不到它我会接受它只是有效 - 我们会看到是否有任何事情发生。无论如何,如果exit()
中存在此流关闭行为,这种行为也会出现在SIGINT
的默认处理程序中(通常用Ctrl + C触发中断信号)?或者,是否有必要做这样的事情:
#include <signal.h>
#include <stdlib.h>
void onInterrupt(int dummy) { exit(0); }
int main() {
signal(SIGINT, onInterrupt);
FILE *file = fopen("file", "a");
for (;;) { fprintf(file, "bleh"); } }
让file
正确关闭?或者可以安全地省略signal(SIG...
和void onInterrupt(...
行吗?
请限制对C,C99和POSIX的任何回复,因为我没有使用GNU libc。感谢。
答案 0 :(得分:7)
C99规范7.19.3的保证较弱:
5如果主要 函数返回其原始调用者,或者如果调用exit函数,则在程序终止之前关闭所有打开的文件(因此刷新所有输出流)。其他途径 程序终止,例如调用中止函数,不需要关闭所有文件 正常。
4通过关闭文件,可以从控制流中取消文件。输出流 被刷新(任何未写入的缓冲区内容被传输到主机环境)之前 流与文件解除关联。
所以在C99中,如果它已经关闭,那么它就会被刷新。
POSIX exit function有更多详细信息,特别是_exit
是否关闭流是实现定义的。
答案 1 :(得分:6)
如果要刷新缓冲区,则必须处理信号。否则,将终止进程并关闭文件描述符而不刷新stdio缓冲区。