1

为了使问题更清楚:

[情况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;
}

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

4

2 回答 2

3

fopen是一个 C 库函数。未指定它是如何实现的。[更正: ] 如果您从 中返回main,所有打开的文件流都会为您关闭(例如 C11 7.21.3/5),但如果程序以其他方式退出(例如通过信号,例如通过),则不需要发生这种情况abort

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

这也解决了您的情况 2:如果您直接使用操作系统功能,例如 Posixopen调用,那么您确实可以放心,当您的进程退出时,这些文件描述符将被关闭。

于 2012-09-02T12:07:53.967 回答
3

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

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

于 2012-09-02T12:07:59.980 回答