linux中的fd就绪时,会立即回调rollback,那么哪位大牛能帮忙解释下fd就绪的条件是什么
发布网友
发布时间:2022-04-14 03:05
我来回答
共1个回答
热心网友
时间:2022-04-14 04:35
select系统调用原型如下:
#include <sys/select.h>int select(int nfds, fd_set* readfds, fd_set* writefds, fd_set* exceptfds, struct timeval* timeout);12
参数readfds, writefds, exceptfds参数分别指向可读、可写和异常事件对应的文件描述符集合。
哪些情况下文件描述符可以被认为是可读、可写或者出现异常,对于select的使用非常关键。
在网络编程中,下列情况下socket可读:
1、socket内核接收缓存区中的字节数大于或等于其低水位标记SO_RCVLOWAT。此时可以无阻塞地读该socket,并且读操作返回的字节数大于0。
2、socket通信对方关闭连接。此时对该socket读操作将返回0。
3、监听socket上有新的连接请求。
4、socket上有未处理的错误。此时我们可以使用getsockopt来读取和清除该错误。
下列情况下socket可写:
1、socket内核发送缓冲区中的可用字节数大于或等于其低水位标记SO_SNDLOWAT。此时我们可以无阻塞写该socket,并且写操作返回的字节数大于0。
2、socket写操作被关闭。对写操作被关闭的socket执行写操作将触发一个SIGPIPE信号。
3、socket使用非阻塞connect连接成功或者失败(超时)之后。
4、socket上有未处理的错误。此时我们可以使用getsockopt来读取和清除该错误。
网络程序中,select能处理的异常情况只有一种:socket上接收到带外数据。