当程序在fclose()之前结束时会出现什么问题

当程序在fclose()之前结束时会出现什么问题,c,operating-system,C,Operating System,我知道不关闭文件是不负责任的,但在以下两种情况下,如果不调用fclose(),会出现什么问题 #include <stdio.h> int main(){ FILE* f = fopen("sample.txt","r"); int *ptr = NULL; *ptr = 1; //seg-fault fclose(f); return 0; }; 1) 如果程序结束时未调用fclose(),操作系统是否会与文件描述符通信,让其知道不再需要该

我知道不关闭文件是不负责任的,但在以下两种情况下,如果不调用
fclose()
,会出现什么问题

#include <stdio.h>
int main(){
    FILE* f = fopen("sample.txt","r");
    int *ptr = NULL;
    *ptr = 1; //seg-fault
    fclose(f);
    return 0;
};
1) 如果程序结束时未调用fclose(),操作系统是否会与文件描述符通信,让其知道不再需要该文件并将其关闭

#include <stdio.h>
int main(){
    FILE* f = open("sample.txt","r");
    return 0;
};
2) 在调用
fclose()
之前是否发生了潜在的分段错误

#include <stdio.h>
int main(){
    FILE* f = fopen("sample.txt","r");
    int *ptr = NULL;
    *ptr = 1; //seg-fault
    fclose(f);
    return 0;
};
#包括
int main(){
文件*f=fopen(“sample.txt”、“r”);
int*ptr=NULL;
*ptr=1;//seg故障
fclose(f);
返回0;
};

如果程序有seg故障,文件处理程序最终将由操作系统释放,就像程序正常退出时一样。但是我看到过seg'ed程序中的文件处理程序无法立即使用的情况


关于前面答案的更多详细信息

如果使用exist,在C语言中,exit函数将调用atexit注册的所有函数并终止程序。刷新文件缓冲区,关闭流,删除临时文件


即使你不这么认为,一旦操作系统终止,它也应该释放所有的程序资源。虽然不清理是一个坏习惯,可能会导致严重的问题

文件中损坏的数据很可能就是答案。我有一个创建pdf的java文件,在文件关闭之前失败,当我试图打开.pdf文件时,它不允许我打开,说数据已损坏。我会尝试捕捉程序的任何潜在停止,以便在退出之前正确关闭文件。对于“正常”操作系统,如果文件以只读方式打开,则不会发生任何错误。但是如果您已经写入文件,缓冲数据很可能不会在C中写入,来自
main()
的返回在任何方面都与将以前的返回值作为参数传递给
exit()
调用的效果完全相同,您是说打开的文件表中的条目将被删除吗?当您编写“文件处理程序…无法立即使用”时,您的意思是另一个进程无法立即打开文件吗?(1)我的意思是C中的文件描述符将变为可用。正如在中指出的,当存在non-exit()关闭时,缓冲区不会被刷新。(2) 分段程序的文件描述符有时不可用,但实际文件可用。“C中的文件描述符”您的意思是“打开的文件”表中的偏移量不能用于发送信号的进程。换句话说,如果你的代码处理信号,比如说,打开的文件描述符是5,那么5在一段时间内不会被重用?正确,这就是我的意思