Linux:多路转接 select、poll、epoll

目录

1:select

1. 参数解释

2. 函数返回值

3. fd_set

4. fd_set 相关接口

5. timeval 

5. 常见使用

6. 理解 select 执行过程

 7. select 的特点

8. select 缺点

9. select 应用

2:socket 就绪条件

1. 读事件就绪(Readable)

 2. 写就绪(Writable)

3. 异常事件就绪(Exception)

 3:poll

1. events 和 revents

2. poll优点

3. poll缺点

4. poll 应用

4:epoll 

 1. epoll_wait

2. epoll 工作原理

 3. 接口总结

4. epoll 的优点

5. epoll 应用


1:select

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

   select 函数是 POSIX 标准定义的一个系统调用,用于监视多个文件描述符(file descriptors),以确定它们是否具有可读、可写或异常条件。

1. 参数解释

        1: int nfds:这是监视的文件描述符集合中最大的文件描述符加一。也就是说,如果你监视的文件描述符最大是 fd_max,那么你应该将 nfds 设置为 fd_max + 1。

        2: fd_set *readfds这是一个指向 fd_set 结构的指针,该结构包含了你想要监视以检查是否有数据可读的文件描述符集合。如果 NULL,则表示不监视任何读文件描述符。

        3: fd_set *writefds这是一个指向 fd_set 结构的指针,包含了你想要监视以检查是否可写的文件描述符集合。如果 NULL,则表示不监视任何写文件描述符。

        4: fd_set *exceptfds这是一个指向 fd_set 结构的指针,包含了你想要监视以检查是否有异常条件的文件描述符集合。在大多数情况下,这用于检查 OOB(out-of-band,紧急)数据。如果 NULL,则表示不监视任何异常文件描述符。

        5: struct timeval *timeout:这是一个指向 timeval 结构的指针,它指定了 select 调用等待文件描述符状态改变的最大时间。

参数 timeout 取值:

        • NULL: 则表示 select() 没有 timeout, select 将一直被阻塞, 直到某个文件描述符上发生了事件;

        • 0: 仅检测描述符集合的状态, 然后立即返回, 并不等待外部事件的发生。

        特定的时间值: 如果在指定的时间段里没有事件发生, select 将超时返回。

2. 函数返回值

        1: 如果有文件描述符准备好了,select 返回准备好的文件描述符的数量。

        2: 如果返回 0 代表在描述词状态改变前已超过 timeout 时间, 没有返回。

        3: 当有错误发生时则返回-1, 错误原因存于 errno, 此时参数 readfds, writefds,exceptfds 和 timeout 的值变成不可预测。

错误值可能为:

        • EBADF 文件描述词为无效的或该文件已关闭。

        • EINTR 此调用被信号所中断。

        EINVAL 参数 n 为负值。

        ENOMEM 核心内存不足。

3. fd_set

        其实这个结构就是一个整数数组, 更严格的说, 是一个 "位图"。使用位图中对应的位来表示要监视的文件描述符。

4. fd_set 相关接口
void FD_CLR(int fd, fd_set *set); // 用来清除描述词组 set 中相关fd 的位

int FD_ISSET(int fd, fd_set *set); // 用来测试描述词组 set 中相关fd 的位是否为真

void FD_SET(int fd, fd_set *set); // 用来设置描述词组 set 中相关fd 的位

void FD_ZERO(fd_set *set); // 用来清除描述词组 set 的全部位
5. timeval 

5. 常见使用
fd_set readset;
FD_SET(fd,&readset);
select(fd+1,&readset,NULL,NULL,NULL);
if(FD_ISSET(fd,readset)){……}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值