假设我们在C中使用fopen()打开了一个文件,我们无意中忘记了使用fclose()关闭它然后可能是什么后果呢?如果我们没有提供源代码但只提供可执行文件,它还有什么解决方案?
答案 0 :(得分:4)
后果是文件描述符被泄露"。操作系统使用一些描述符,并且具有与该打开文件相关联的一些资源。如果您fopen
并且没有关闭,则该描述符不会被清除,并且会一直持续到程序关闭。
如果文件可能多次打开,则此问题更加复杂。随着程序运行,越来越多的描述符将被泄露,直到最终操作系统拒绝或无法创建另一个描述符,在这种情况下,对fopen
的调用失败。
如果您只提供可执行文件,而不是源代码,那么您的选项非常有限。此时你必须手动反编译或重写程序集,这两种程序都不具备吸引力。
正确的做法是提交错误报告,然后获取更新/修复版本。
答案 1 :(得分:2)
如果有很多文件打开但没有正确关闭,程序最终将耗尽文件句柄和/或内存空间并崩溃。
建议您让开发人员更新他们的代码。
答案 2 :(得分:0)
结果依赖于实现,基于fclose
/ fopen
和相关函数 - 它们是缓冲输入/输出函数。因此写入“文件”的事实上首先写入内部缓冲区 - 当代码“感觉就像”时,缓冲区只被刷新输出 - 可能是每一行,每个完整块的每次写入取决于实施的智能性。
fopen
很可能使用open
来获取操作系统的实际文件描述符 - 在大多数系统(Linux,Windows等)上,操作系统将关闭操作系统文件描述符。进程终止 - 但是如果程序没有终止,os文件描述符将泄漏,你最终将耗尽文件描述符并死掉。
当程序干净地或通过崩溃终止时,某些标准可能会强制要求特定行为,但事实是您不能在此回复,因为并非所有实现都可能遵循此行为。
因此,您的风险在于您将丢失您编程认为已编写的某些数据 - 这些数据位于内部缓冲区但从未刷新 - 或者您可能用完了文件描述符并且死了。
所以,修复代码。