c - 如果我不在 C 程序中调用 fclose() 会发生什么?

标签 c file-io fopen fclose

首先,我知道用 fopen() 打开一个文件而不关闭它是非常不负责任的,也是一种糟糕的形式。这只是纯粹的好奇心,所以请幽默我:)

我知道如果一个 C 程序打开一堆文件并且从不关闭其中任何一个,最终 fopen() 将开始失败。是否有任何其他副作用可能导致代码本身之外的问题?例如,如果我有一个程序打开一个文件,然后在不关闭它的情况下退出,这会不会给运行该程序的人带来问题?这样的程序会泄漏任何东西(内存、文件句柄)吗?程序完成后再次访问该文件会不会有问题?如果程序连续运行多次会怎样?

最佳答案

只要您的程序正在运行,如果您一直打开文件而不关闭它们,最有可能的结果是您将用完可用于您的进程的文件描述符/句柄,并且尝试打开更多文件最终将失败。在 Windows 上,这还可以防止其他进程打开或删除您打开的文件,因为默认情况下,文件以独占共享模式打开,阻止其他进程打开它们。

一旦您的程序退出,操作系统将在您之后进行清理。当它终止你的进程时,它会关闭你打开的任何文件,并执行任何其他必要的清理(例如,如果一个文件被标记为关闭时删除,它会删除该文件;请注意,这种事情是平台- 具体)。

但是,另一个需要注意的问题是缓冲数据。大多数文件流在将数据写出到磁盘之前先在内存中缓冲数据。如果您正在使用来自 stdio 库的 FILE* 流,则有两种可能性:

  1. 您的程序通过调用 exit(3) 正常退出。函数,或从 main 返回(隐式调用 exit(3))。
  2. 你的程序异常退出;这可以通过调用 abort(3) 来实现或 _Exit(3) ,死于信号/异常等。

如果您的程序正常退出,C 运行时将负责刷新所有打开的缓冲流。因此,如果您将缓冲数据写入未刷新的 FILE*,它将在正常退出时刷新。

相反,如果您的程序异常退出,则任何缓冲数据都不会被刷新。不会。当进程终止时,操作系统只是说“天哪,你打开了一个文件描述符,我最好为你关闭它”;它不知道内存中某处有一些随机数据,该程序打算将其写入磁盘但没有写入。所以要小心。

关于c - 如果我不在 C 程序中调用 fclose() 会发生什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8175827/

相关文章:

android - myFile.exists() 在 Android 中不符合逻辑

c - 如何在 C 中创建自定义文件名?

c - 测试多个数组中是否存在某些值的最简单方法是什么?

使用 dlsym 清理函数插入

c - stm32f103中多 channel 转换中adc的转换顺序

Python字符串处理优化

java - 读取 XML 文件中的数据并将其保存到数组中

C 文件检查文件是否为空或包含 ASCII 文本

c - fclose() 段错误

c - 如何将结构属性作为参数传递