在什么情况下,使用 close(int fildesc) 方法关闭网络套接字时可能会产生返回值 -1?我认为使用无效的 fildesc 编号是可能的,但是使用有效的现有套接字会发生这种情况吗?
如果发生这种情况,程序应该如何反应?
答案1
Linux 手册页close()
描述了在有效文件描述符上返回 -1 的一些可能情况:
不检查 close() 的返回值是一个常见但严重的编程错误。很可能在最后的 close() 中首先报告先前 write(2) 操作的错误。关闭文件时不检查返回值可能会导致数据无提示丢失。使用 NFS 和磁盘配额尤其可以观察到这一点。
我想这部分内容也适用于 Linux 以外的其他内核。然后是这个警告(我强调了):
请注意,返回值只能用于诊断。 特别是,不应在 EINTR 之后重试 close(),因为这可能会导致另一个线程中重用的描述符被关闭。
您可能想阅读以下内容中找到的一些基本原理这篇 lwn.net 文章:
传递给 close() 的文件描述符在系统调用处理的早期就被取消分配,并且在 close() 返回时相同的描述符可能已经被分发给另一个线程。
因此,对于套接字描述符,我们可能会EINTR
在关闭套接字时遇到,特别是在使用它发送大量数据之后,但是我们应该绝不在Linux上写这样的代码:
while (close(sock) == -1 && errno == EINTR);