不关闭使用open或fopen打开的文件有什么影响

时间:2012-09-02 12:02:27

标签: c

使问题更清晰:

[案例1]

#include <stdio.h>
int main ()  {
    FILE* file = fopen("myfile.txt", "r");
    return 0;
}

[案例2]

#include <stdio.h>
int main () {
    int fd = open("myfile.txt", O_RDONLY);
    return 0;
}

在两个示例中未正确关闭文件时会发生什么?缓冲区是否刷新到文件中?我假设文件至少会自动关闭......是吗?

2 个答案:

答案 0 :(得分:3)

fopen是一个C库函数。没有具体说明如何实施。 [更正:]如果从main返回,则所有打开的文件流都将为您关闭(例如C11 7.21.3 / 5),但如果程序退出其他程序则不需要方式(例如通过信号,例如通过abort)。

当一个进程终止时,您的底层操作系统实现当然会正确清理所有内容,但这只是涉及到系统的全局状态(例如,与您的进程关联的所有虚拟内存都将被释放,并且所有文件都将被释放)描述符关闭等)。如果C库实现了自己的写缓冲区,那么就没有理由在每种情况下自动刷新(尽管从main返回正常退出很好)。

这也解决了你的情况2:如果你直接使用OS功能,比如Posix open调用,那么你确实确保在你的进程退出时关闭那些文件描述符。

答案 1 :(得分:3)

是。程序终止前,所有打开的文件都将关闭。

  

(C99,7.19.3p5)“如果main函数返回其原始调用者,或者调用了exit函数,则在程序终止之前关闭所有打开的文件(因此刷新所有输出流)。”