use*_*882 13 sockets linux network-programming poll-syscall
我想知道在轮询设置这些位时应该怎么做?关闭套接字,忽略它或什么?
jxh*_*jxh 16
A POLLHUP表示套接字不再连接.在TCP中,这意味着FIN已被接收和发送.
A POLLERR表示套接字出现异步错误.在TCP中,这通常意味着已经接收或发送了RST.如果文件描述符不是套接字,则POLLERR可能意味着设备不支持轮询.
对于上述两个条件,套接字文件描述符仍处于打开状态,尚未关闭(但shutdown()可能已被调用).close()文件描述符上的A 将释放仍代表套接字保留的资源.理论上,应该可以立即重用套接字(例如,使用另一个connect()调用).
A POLLNVAL表示套接字文件描述符未打开.这将是一个错误close().
它取决于确切的错误性质.使用getsockopt()来查看问题:
int error = 0;
socklen_t errlen = sizeof(error);
getsockopt(fd, SOL_SOCKET, SO_ERROR, (void *)&error, &errlen);
Run Code Online (Sandbox Code Playgroud)
值:http://www.xinotes.net/notes/note/1793/
最简单的方法是假设套接字在任何情况下都不再可用并关闭它.
POLLNVAL表示文件描述符值无效。它通常表示您的程序中存在错误,但是如果您关闭了一个文件描述符并且此后没有打开任何可能重用该描述符的文件,您可以依靠poll返回POLLNVAL。
POLLERR类似于来自 的错误事件select。它表示readorwrite调用将返回错误条件(例如 I/O 错误)。这不包括select通过其errorfds掩码poll发出信号但通过发出信号的带外数据POLLPRI。
POLLHUP基本上意味着连接另一端的内容已关闭其连接端。POSIX将其描述为
设备已断开连接。这个事件和POLLOUT是互斥的;如果发生挂断,流将永远不可写。
这对于终端来说已经足够清楚了:终端已经消失(生成 SIGHUP 的同一事件:调制解调器会话已终止,终端仿真器窗口已关闭等)。POLLHUP永远不会为常规文件发送。对于管道和套接字,它取决于操作系统。LinuxPOLLHUP在管道写入端的程序关闭管道POLLIN|POLLHUP时设置,并在套接字的另一端关闭套接字时设置,但POLLIN仅适用于套接字关闭。POLLIN|POLLUP当管道的写入端关闭管道时,最近的 *BSD 设置,并且套接字的行为更加可变。