我正在使用 c 。我有 fd1 作为文件描述符,我可以这样调用两次吗?
main () {
....
shutdown(fd1, SHUT_WR);
....
shutdown(fd1, SHUT_WR);
....
}
我个人认为它有效,因为 fd1 还没有真正免费。就是想找人确认一下。
我正在使用 c 。我有 fd1 作为文件描述符,我可以这样调用两次吗?
main () {
....
shutdown(fd1, SHUT_WR);
....
shutdown(fd1, SHUT_WR);
....
}
我个人认为它有效,因为 fd1 还没有真正免费。就是想找人确认一下。
您应该检查第二次调用的返回值 -shutdown(2)
可能返回-1
- 并检查errno(3)
.
在我的 Linux 和 glibc 版本上,我可以shutdown
在同一个打开的套接字上多次调用。它会很高兴地返回 0 ,直到套接字实际上在那个方向上被拆除,然后将返回 -1 和errno == ENOTCONN
. EBADF
在您使用 FD 之前它不会返回close
,那么您无论如何都不应该使用该 FD。
这个事实实际上非常有用,因为您可以在循环中调用 shutdown 以检测连接是否以某种方式被断开。epoll
发现套接字上的错误似乎会在正确的时间唤醒它。
您可以调用它一次来关闭输出,然后再调用它来关闭输入,反之亦然。调用它两次来关闭输出肯定不会发送两个 FIN,不管它可能做什么。调用它两次来关闭输入也不能做任何事情两次。所以这些都不可能有任何实际意义。
注意你根本不能在文件描述符上调用它。您可以在套接字描述符上调用它。
调用shutdown
只是启动 TCP 级别的关闭序列。除非您调用它,否则套接字描述符永远不会被释放以供重用close
。
您可以随意调用shutdown
,但后续调用可能会导致错误。
close
完成套接字后调用。