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

时间:2010-01-11 19:34:03

标签: 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"); } }

file正确关闭?或者可以安全地省略signal(SIG...void onInterrupt(...行吗?

请限制对C,C99和POSIX的任何回复,因为我没有使用GNU libc。感谢。

2 个答案:

答案 0 :(得分:7)

C99规范7.19.3的保证较弱:

  

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

     

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

所以在C99中,如果它已经关闭,那么它就会被刷新。

POSIX exit function有更多详细信息,特别是_exit是否关闭流是实现定义的。

答案 1 :(得分:6)

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