2

socketfd在 BSD 套接字上多次调用 close() 是否安全?

4

2 回答 2

3

手册

close()成功返回零。出错时-1返回,并errno进行适当设置。

错误

  EBADF  fd isn’t a valid open file descriptor.

因此,close调用将因上述错误而失败是有道理的。(这确实是我的机器上发生的事情。)

于 2012-09-17T16:52:39.767 回答
1

EBADF正如其他人所提到的,如果文件描述符在初始关闭后没有被(重新)用于任何内容,您将得到一个。

通常的做法是在 fd 关闭后为其分配一个无效编号。一个常用的成语

 close(fd);
 fd = -1;

应该是使用的成语。这样,再次关闭套接字将导致静默EBADF并且不会破坏新分配的有效文件描述符的状态。

(请注意,“无效文件句柄”的值在其他平台上可能不同.. 即 windows (?);但应该适用于任何 POSIX 系统)。

于 2012-09-19T16:08:36.117 回答