select系统调用 -- 文件描述符就绪条件

来源:互联网 发布:劲舞团网络连接中断 编辑:程序博客网 时间:2024/05/16 02:03

select系统调用原型如下:

#include <sys/select.h>int select(int nfds, fd_set* readfds, fd_set* writefds, fd_set* exceptfds, struct timeval* timeout);

参数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上接收到带外数据。


《Linux高性能服务器编程》

0 0
原创粉丝点击