多次在BSD套接字socketfd
上调用close()是否安全?
答案 0 :(得分:3)
来自manual:
close()
成功时返回零。出错时,会返回-1
,并且errno
已正确设置。错误
EBADF fd isn’t a valid open file descriptor.
因此,close
调用将因上述错误而失败。 (这确实是我机器上发生的事情。)
答案 1 :(得分:1)
正如其他人所提到的,如果文件描述符在初始关闭后没有被(重新)用于任何事情,那么你将获得EBADF
。
通常的做法是在fd关闭后为fd指定一个无效的数字。一个常用的习惯用法
close(fd);
fd = -1;
应该是使用的成语。这样,再次关闭套接字将导致静默EBADF
,而不是破坏新分配的有效文件描述符的状态。
(注意'无效文件句柄'值在其他平台上可能有所不同......即windows(?);但应该适用于任何POSIX系统。)