2

我正在使用 c 。我有 fd1 作为文件描述符,我可以这样调用两次吗?

main () {
....
shutdown(fd1, SHUT_WR);
....
shutdown(fd1, SHUT_WR);
....
}

我个人认为它有效,因为 fd1 还没有真正免费。就是想找人确认一下。

4

4 回答 4

2

您应该检查第二次调用的返回值 -shutdown(2)可能返回-1- 并检查errno(3).

于 2010-11-13T04:08:06.143 回答
1

在我的 Linux 和 glibc 版本上,我可以shutdown在同一个打开的套接字上多次调用。它会很高兴地返回 0 ,直到套接字实际上在那个方向上被拆除,然后将返回 -1 和errno == ENOTCONN. EBADF在您使用 FD 之前它不会返回close,那么您无论如何都不应该使用该 FD。

这个事实实际上非常有用,因为您可以在循环中调用 shutdown 以检测连接是否以某种方式被断开。epoll发现套接字上的错误似乎会在正确的时间唤醒它。

于 2014-03-27T06:33:08.770 回答
0

您可以调用它一次来关闭输出,然后再调用它来关闭输入,反之亦然。调用它两次来关闭输出肯定不会发送两个 FIN,不管它可能做什么。调用它两次来关闭输入也不能做任何事情两次。所以这些都不可能有任何实际意义。

注意你根本不能在文件描述符上调用您可以在套接字描述符上调用它。

于 2010-11-13T04:14:12.303 回答
0

调用shutdown只是启动 TCP 级别的关闭序列。除非您调用它,否则套接字描述符永远不会被释放以供重用close

您可以随意调用shutdown,但后续调用可能会导致错误。

close完成套接字后调用。

于 2010-11-13T07:46:49.913 回答