IO多路复用(select)

一. 前言

        IO 多路复用技术是指由进程通知内核监听指定的一个或多个 IO 事件,当 IO 事件发生时由内核通知唤醒进程,它一般用在一个进程需要同时监听处理多个 IO 事件的场景,与多进程或多线程的方式相比,使用 IO 多路复用技术无需创建多个进程或线程,减少系统开销。

        本文将介绍 select 函数的用法,它允许进程通知内核监听多个 IO 事件,并在事件发生或者设置的超时时间到达时唤醒进程处理。
 

二. select

函数原型:

int select(int nfds, fd_set *readfds, fd_set *writefds, fd_set *exceptfds, struct timeval *timeout);

参数说明:

nfds:监听的所有文件描述符中最大的文件描述符加一

readfds:监听可读事件的文件描述符集合

writefds:监听可写事件的文件描述符集合

exceptfds:监听异常事件的文件描述符集合

        readfds, writefds, exceptfds 分别表示读,写,异常事件的集合,可以直接使用 fd_set 创建一个 fd 集合变量,使用 FD_ZERO 清空集合,使用 FD_SET 把指定 fd 添加到集合中,使用 FD_CLR 把指定 fd 从集合中删除,使用 FD_ISSET 可以判断指定 fd 是否在集合中。如果不关心相应的事件,可以在调用该函数时直接传 NULL。FD_ZERO,FD_SET,FD_CLR,FD_ISSET 原型如下:

void FD_ZERO(fd_set *fdset);

void FD_SET(int fd, fd_set *fdset);

void FD_CLR(int fd, fd_set *fdset);

int FD_ISSET(int fd, fd_set *fdset); 

timeout:超时时间,timeval 结构如下。

struct timeval {
    long tv_sec;   // seconds
    long tv_usec;  // microseconds
};

        当 timeout 设置为 NULL 表示一直等待,直到有至少一个事件发生时才返回。

        当 timeout 设置为大于 0 的超时时间表示等待至少一个事件发生时才返回,但是超时时间到达时即使没有事件也会返回。

        当 timeout 设置为 0 的超时时间(非 NULL)表示检查后立刻返回,即轮询的方式。

返回值说明:

成功情况下返回监听事件集合中产生了事件的数量,例如监听 3 个可读事件,3 个可写事件,3 个异常事件,实际发生 1 个可读事件 1 个,1 个可写事件,2 个异常事件,那么返回值为 4。

失败情况下返回 -1,并设置 errno。

猜你喜欢

转载自blog.csdn.net/weixin_38102771/article/details/123179962