【问题标题】:Why do we need to close a file in C? [duplicate]为什么我们需要在 C 中关闭文件? [复制]
【发布时间】:2014-08-13 01:41:20
【问题描述】:

假设我们在 C 语言中使用 fopen() 打开了一个文件,但我们无意中忘记使用 fclose() 关闭它,那么它的后果是什么?如果我们没有提供源代码而只提供可执行文件,还有什么解决方案?

【问题讨论】:

  • 如果您怀疑可执行文件中存在问题,您需要在源代码中修复它。如果您没有源代码,请将其返回给开发人员。
  • 如果 fopen 是在 read-only 模式下完成的,虽然这是非常差的编码质量,但至少不会对文件中的数据造成任何问题。但是,如果 fopen 是使用 write 模式完成的,那么您现在很有可能破坏该文件中的数据。

标签: c file-management


【解决方案1】:

结果是文件描述符被“泄露”。操作系统使用一些描述符,并且有一些与该打开文件相关联的资源。如果你fopen 并且不关闭,那么该描述符将不会被清理,并且会一直持续到程序关闭。

如果文件可能被多次打开,则此问题会更加复杂。随着程序运行,越来越多的描述符将被泄露,直到最终操作系统拒绝或无法创建另一个描述符,在这种情况下,对 fopen 的调用将失败。

如果只为您提供可执行文件而不是源代码,那么您的选择将非常有限。那时,您必须尝试手动反编译或重写程序集,这两种方法都不是有吸引力的选择。

正确的做法是提交错误报告,然后获取更新/修复的版本。

【讨论】:

  • 系统最终会因为内存限制而拒绝还是有其他原因?例如,假设我们不断fopen-ed 并且我们有无限的内存,系统会不会拒绝打开文件?
【解决方案2】:

如果有很多文件打开但没有正确关闭,程序最终会耗尽文件句柄和/或内存空间并崩溃。

建议您让您的开发人员更新他们的代码。

【讨论】:

    【解决方案3】:

    结果是基于fclose / fopen 和相关函数的实现——它们是缓冲的输入/输出函数。因此,写入“文件”的内容实际上是首先写入内部缓冲区——只有在代码“感觉像”时才会刷新缓冲区以输出——这可能是每一行,每个完整块的每次写入取决于实现的智能程度。

    fopen 很可能会使用open 来获取操作系统的实际文件描述符——在大多数系统(Linux、Windows 等)上,当进程终止时操作系统将关闭 os 文件描述符—— - 但是如果程序没有终止,os 文件描述符会泄漏,你最终会用完文件描述符并死掉。

    当程序完全终止或通过崩溃终止时,某些标准可能会强制执行特定行为,但事实是您无法在此回复,因为并非所有实现都可能遵循此规则。

    所以你的风险是你会丢失一些你的程序认为它已经写入的数据——这将是那些位于内部缓冲区但从未刷新的数据——或者你可能会用完文件描述符然后死去。

    所以,修复代码。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-05-27
      • 1970-01-01
      • 2014-08-25
      • 2014-09-24
      • 2016-09-24
      • 1970-01-01
      • 2020-09-26
      相关资源
      最近更新 更多