为什么我们需要关闭C中的文件?

为什么我们需要关闭C中的文件?,c,file-management,C,File Management,假设我们在C中使用fopen()打开了一个文件,但无意中忘记了使用fclose()关闭它,那么会有什么后果呢?另外,如果我们没有提供源代码而只提供可执行文件,那么解决方案是什么?结果是文件描述符“泄漏”。操作系统使用一些描述符,并且有一些与打开的文件相关联的资源。如果您fopen且未关闭,则该描述符将不会被清除,并将一直保留到程序关闭 如果文件可能会被打开多次,那么这个问题就更加复杂了。随着程序运行,越来越多的描述符将被泄漏,直到最终操作系统拒绝或无法创建另一个描述符,在这种情况下,对fopen

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

结果是文件描述符“泄漏”。操作系统使用一些描述符,并且有一些与打开的文件相关联的资源。如果您
fopen
且未关闭,则该描述符将不会被清除,并将一直保留到程序关闭

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

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


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

如果有大量文件打开但未正确关闭,程序最终将耗尽文件句柄和/或内存空间并崩溃


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

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

fopen
最有可能使用
open
获取操作系统的实际文件描述符——在大多数系统(Linux、Windows等)上,当进程终止时,操作系统将关闭操作系统文件描述符——但是如果程序未终止,操作系统文件描述符将泄漏,最终会耗尽文件描述符并导致死亡

当程序干净地终止或通过崩溃终止时,某些标准可能会强制执行特定的行为,但事实是,您无法对此进行回复,因为并非所有实现都会遵循此操作

因此,您的风险在于,您将丢失一些您的程序认为它已经写入的数据——这些数据可能是位于内部缓冲区中但从未刷新过的数据——或者您可能会耗尽文件描述符而死亡


因此,修复代码。

如果怀疑可执行文件中存在问题,则需要在源代码中修复。如果您没有源代码,请将其返回给开发人员。如果该fopen是在只读模式下完成的,那么尽管这是非常糟糕的编码质量,但至少不会导致文件中的数据出现任何问题。但是如果fopen是使用写入模式完成的,那么现在很有可能会损坏该文件中的数据。系统最终会因为内存限制而拒绝吗?还是有其他原因?例如,假设我们不断地打开,并且我们有无限的内存,系统会不会永远拒绝打开文件?