使问题更清晰:
[案例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;
}
在两个示例中未正确关闭文件时会发生什么?缓冲区是否刷新到文件中?我假设文件至少会自动关闭......是吗?
答案 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函数,则在程序终止之前关闭所有打开的文件(因此刷新所有输出流)。”