当然,在大多数情况下,即使我坚信一个进程应该正确地清理分配的任何资源,我的立即回答也是“是”,但在我的情况下,我有一个长时间运行的系统守护进程,在启动时打开固定数量的文件描述符,并在退出前关闭所有文件描述符。这是一个嵌入式平台,我试图尽可能使代码紧凑,同时不引入任何不良风格。但由于文件描述符无论如何都会在退出之前被关闭,所以这个文件描述符清理代码有什么作用?你总是关闭你的所有文件描述符吗?
当你使用完文件描述符后关闭它们可以使你的代码更具可复用性和可扩展性。在我看来,这听起来像一个让它们自动关闭的有效理由。
是的,关闭文件描述符并释放所有堆内存,即使你知道操作系统会清理它-这样,当你运行valgrind或类似工具时,你不会在结果中得到很多噪音,并且你可以轻松地识别“合法”的fd泄漏。
我对于自动清理关闭文件描述符存在的唯一担忧是,如果您关心已写入该文件描述符的任何数据,并且是否可以合理地处理写入失败。
write() 不必阻塞(取决于首次 open() 的方式),并等待数据成功提交,因此在某些情况下,close 可能会失败,因为底层子系统无法提交挂起的写操作,从而导致 close 退出失败并将 errno 设置为 EIO,并且根据您刚刚编写的内容,您可能需要或不需要采取一些纠正措施。
诚然,这是一个特殊情况,您真正关心数据一致性,即 DBMS 类型的应用程序或备份成功/失败的报告。 在许多(大多数?)情况下,实际上并不太重要,您可以放心离开 close() 进行清理/退出处理。
man 3 exit:
....
All open stdio(3) streams are flushed and closed. Files created by tmpfile(3) are removed.
我相信离开主函数会有效地调用exit函数,并返回主函数的返回值。虽然我认为这是不好的编程风格。个人而言,我总是显式地释放/关闭任何已获取的资源。