首先,我知道用 fopen() 打开一个文件而不关闭它是非常不负责任的,也是一种糟糕的形式。这只是纯粹的好奇心,所以请幽默我:)
我知道如果一个 C 程序打开一堆文件并且从不关闭其中任何一个,最终 fopen() 将开始失败。是否有任何其他副作用可能导致代码本身之外的问题?例如,如果我有一个程序打开一个文件,然后在不关闭它的情况下退出,这会不会给运行该程序的人带来问题?这样的程序会泄漏任何东西(内存、文件句柄)吗?程序完成后再次访问该文件会不会有问题?如果程序连续运行多次会怎样?
最佳答案
只要您的程序正在运行,如果您一直打开文件而不关闭它们,最有可能的结果是您将用完可用于您的进程的文件描述符/句柄,并且尝试打开更多文件最终将失败。在 Windows 上,这还可以防止其他进程打开或删除您打开的文件,因为默认情况下,文件以独占共享模式打开,阻止其他进程打开它们。
一旦您的程序退出,操作系统将在您之后进行清理。当它终止你的进程时,它会关闭你打开的任何文件,并执行任何其他必要的清理(例如,如果一个文件被标记为关闭时删除,它会删除该文件;请注意,这种事情是平台- 具体)。
但是,另一个需要注意的问题是缓冲数据。大多数文件流在将数据写出到磁盘之前先在内存中缓冲数据。如果您正在使用来自 stdio 库的 FILE*
流,则有两种可能性:
- 您的程序通过调用
exit(3)
正常退出。函数,或从main
返回(隐式调用exit(3)
)。 - 你的程序异常退出;这可以通过调用
abort(3)
来实现或_Exit(3)
,死于信号/异常等。
如果您的程序正常退出,C 运行时将负责刷新所有打开的缓冲流。因此,如果您将缓冲数据写入未刷新的 FILE*
,它将在正常退出时刷新。
相反,如果您的程序异常退出,则任何缓冲数据都不会被刷新。不会。当进程终止时,操作系统只是说“天哪,你打开了一个文件描述符,我最好为你关闭它”;它不知道内存中某处有一些随机数据,该程序打算将其写入磁盘但没有写入。所以要小心。
关于c - 如果我不在 C 程序中调用 fclose() 会发生什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8175827/