select多路IO复用

来源:互联网 发布:今年双十一淘宝成交额 编辑:程序博客网 时间:2024/06/16 17:39
多路IO转接服务器也叫做多任务IO服务器。该类服务器实现的主旨思想是,不再由应用程序自己监视客户端连接,取而代之由内核替应用程序监视文件。

主要使用的方法有三种:select、poll、epoll,这次介绍一下select。

select函数原形:

int select (int nfds,  fd_set *readset,  fd_set *writeset,
fd_set *exceptset,  const struct timeval * timeout);

参数一:监控所有文件描述符集里最大文件描述符加1,因为此参数会告诉内核检测前多少个文件描述符的状态
参数二:监控有读数据到达文件描述符集合,传入传出参数
参数三:监控写数据到达文件描述符集合,传入传出参数
参数四:监控异常发生达文件描述符集合,如带外数据到达异常,传入传出参数
参数五:定时阻塞监控时间,一个指向timeval结构的指针,用于决定select等待I/o的最长时间。如果为空将一直等待。
timeval结构的定义:
    struct timeval{
        long tv_sec; // seconds(秒)
        long tv_usec; // microseconds(微秒)
    }
成功返回:所有监听集合中,满足条件的总数,也就是你监听的读、写、异常全部满足加起来的总数。
失败返回错误码


对文件集合的操作函数,fd_set(文件集合, 实现是一个位图)
    void FD_CLR(int fd, fd_set *set);     //把文件描述符集合里fd清0
    int FD_ISSET(int fd, fd_set *set);     //测试文件描述符集合里fd是否置1
    void FD_SET(int fd, fd_set *set);     //把文件描述符集合里fd位置置为1
    void FD_ZERO(fd_set *set);             //把文件描述符集合里所有位清0

select注意事项:select能监听的文件描述符个数受限于FD_SETSIZE,一般为1024,单纯改变进程打开的文件描述符个数并不能改变select监听文件个数。

原创粉丝点击