开放流是否在C中的SIGINT上自动刷新和关闭?

Oll*_*ers 4 c posix signals

我在一个手册页中读到,当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.谢谢.

Pet*_*ham 7

C99规范7.19.3有一个较弱的保证:

5如果main函数返回其原始调用者,或者调用exit函数,则在程序终止之前关闭所有打开的文件(因此刷新所有输出流).程序终止的其他路径,例如调用中止函数,无需正确关闭所有文件.

4通过关闭文件,可以从控制流中取消文件.在将流与文件解除关联之前,刷新输出流(任何未写入的缓冲区内容都将传输到主机环境).

因此在C99中,如果它关闭则会刷新.

POSIX exit函数有更多的细节,特别是是否_exit关闭流定义的实现.


Ric*_*ton 6

如果要刷新缓冲区,则必须处理信号.否则,将终止进程并关闭文件描述符而不刷新stdio缓冲区.