所以我一直在研究 fclose 手册页,我的结论是,如果 fclose 被某些信号打断,根据手册页,没有办法恢复......?我错过了什么吗?
通常,对于无缓冲的 POSIX 函数(打开、关闭、写入等),总是有一种方法可以通过重新启动调用从信号中断 (EINTR) 中恢复;相反,缓冲调用的文档指出,在 fclose 尝试失败后,另一次尝试具有未定义的行为......没有提示如何恢复。如果信号中断 fclose,我只是“不走运”吗?数据可能会丢失,我无法确定文件描述符是否实际关闭。我知道缓冲区已被释放,但文件描述符呢?考虑一下同时使用大量 fd 的大型应用程序,如果 fd 没有正确释放会遇到问题 -> 我认为必须有一个 CLEAN 解决方案来解决这个问题。
因此,假设我正在编写一个库,并且不允许使用 sigaction 和 SA_RESTART 并且发送了很多信号,如果 fclose 被中断,我该如何恢复?在 fclose 因 EINTR 失败后,在循环中调用 close(而不是 fclose)是个好主意吗?fclose 的文档根本没有提到文件描述符的状态。不过 UNDEFINED不是很有帮助...如果 fd 关闭并且我再次调用 close ,可能会出现奇怪的难以调试的副作用,所以我很自然地宁愿忽略这种情况,因为做错了...然后再一次,那里没有无限数量的文件描述符可用,资源泄漏是某种错误(至少对我而言)。
当然,我可以检查fclose 的一个具体实现,但我不敢相信有人设计了 stdio 却没有考虑到这个问题?仅仅是文档不好还是这个功能的设计?
这个角落的案例真的让我很烦:(