我在一个手册页中读到,当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"); } }
Run Code Online (Sandbox Code Playgroud)
要file
正确关闭?或者可以安全地省略signal(SIG...
和void onInterrupt(...
线路?
请限制对C,C99和POSIX的任何回复,因为我没有使用GNU libc.谢谢.
C99规范7.19.3有一个较弱的保证:
5如果main函数返回其原始调用者,或者调用exit函数,则在程序终止之前关闭所有打开的文件(因此刷新所有输出流).程序终止的其他路径,例如调用中止函数,无需正确关闭所有文件.
4通过关闭文件,可以从控制流中取消文件.在将流与文件解除关联之前,刷新输出流(任何未写入的缓冲区内容都将传输到主机环境).
因此在C99中,如果它关闭则会刷新.
该POSIX exit函数有更多的细节,特别是是否_exit
关闭流定义的实现.