如果多次调用BSD套接字上的close()会发生什么

时间:2012-09-17 16:30:12

标签: c sockets

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

2 个答案:

答案 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系统。)