当前位置:网站首页>unix环境编程 第十四章 14.4 I/O多路转接
unix环境编程 第十四章 14.4 I/O多路转接
2022-08-09 10:26:00 【玛丽苏打肉饼】
14.4.1 函数select和pselect
#include <sys/select.h>
int select(int maxfdpl, fd_set *restrict readset, fd_set *restrict writeset, fd_set* restrict exceptset, struct timeval *restrict tvptr);参数:struct timeval *restrict tvptr。
它指示愿意等待的时间长度,单位为秒和微妙。有以下三种情况:
- tvptr==NULL。永远等待。如果捕捉到一个信号则中断此无限期等待。当所指定的描述符中的一个已准备好或捕捉到一个信号则返回。如果捕捉到一个信号,则select返回-1,errno设置为EINTR。
- tvptr->tv_sec==0 && tvptr->tv_usec==0。根本不等待,测试所有指定的描述符并立即返回。
- tvptr->tv_sec!=0 || tvptr->tv_usec!=0。等待指定的秒数和微妙数。当指定的描述符之一已准备好,或当指定的时间值已经超过时立即返回。如果在超时到期时还没有一个描述符准备好,则返回值时0。
中间三个参数:readfs,writefds,exceptfds是指向描述符集的指针。
这3个描述符集说明了我们关心的可读,可写或处于异常条件的描述符集合。每个描述符集存储在一个fd_set数据类型中。
在声明了一个描述符集之后,必须用FD_ZERO将这个描述符集置为0,然后在其中设置我们关心的各个描述符的位。
selece中间三个参数中的任意一个可以是空指针,这表示对相应条件并不关心。
select第一个参数maxfdp1的意思是“最大文件描述符编号值加1”。
select有三个可能的返回值
- 返回值-1表示出错,在此情况下,一个描述符集都不修改。
- 返回值0表示没有描述符准备好,此时所有的描述符集都会设置位0.
- 一个正返回值说明了已经准备好的描述符数。该值是3个描述符集种已准备好的描述符数之和,所以如果同一描述符已准备好读和写,那么在返回值种会对其计两次数。
对于“准备好”的含义要做一些说明:
若对读集(readfds)中的一个描述符进行的read操作不会阻塞,则认为此描述符是准备好的。
若对写集(writefds)中的一个描述符进行的write操作不会阻塞,则认为此描述符是准备好的。
若对异常条件集中的一个描述符有一个未决异常条件,则认为此描述符集是主备好的。
对于读,写和异常条件,普通文件的文件描述符总是返回准备好。
14.4.2函数poll
poll函数和select函数类似,但是程序员接口有所不同。poll函数可以同于任何类型的文件描述符。
#include <poll.h>
int poll(struct pollfd fd[], nfds_t nfds, int timeout);
//返回值:准备就绪的描述符数目,若超时,返回0,若出错,返回-1与select不同,poll不是为每个条件构造一个描述符集,而是构造一个pollfd结构的数组,每个数组元素指定一个描述符编号以及我们对改描述符感兴趣的条件。
struct pollfd{
int fd;
short events;
short revents;
};fdarray数组中的元素由数由nfds指定。
poll的events和revents标志:
| 标志名 | 输入至events? | 从revents得到结果? | 说明 |
| POLLIN | yes | yes | 普通或优先级带数据可读 |
| POLLRDNORM | yes | yes | 普通数据可读 |
| POLLRDBAND | yes | yes | 优先级带数据可读 |
| POLLPRI | yes | yes | 高优先级数据可读 |
| POLLOUT | yes | yes | 普通数据可写 |
| POLLWRNORM | yes | yes | 普通数据可写 |
| POLLWRBAND | yes | yes | 优先级带数据可写 |
| POLLERR | yes | 发生错误 | |
| POLLHUP | yes | 发生挂起 | |
| POLLNVAL | yes | 描述字不是一个打开的文件 |
poll的最后一个参数指定的是我们愿意等待多长时间。
timeout==-1
永远等待,当所指定的描述符中的一个已经准备好,或捕捉到一个信号时返回。如果捕捉到一个信号,则poll返回-1,errno设置为EINTR。
timeout==0
不等待。测试所有描述符并立即返回。
timeout>0
等待timeout毫秒。当指定的描述符之一已经准备好,或者timeout到期时立即返回。如果timeout到期时还没有一个描述符准备好,则返回值时0.
边栏推荐
- EndNoteX9 OR X 20 Guide
- 函数组件和类组件和dva视图更新问题
- 分类预测 | MATLAB实现CNN-LSTM(卷积长短期记忆神经网络)多特征分类预测
- 1003 我要通过! (20 分)
- [Halcon&几何] 直线的垂线与延长线的计算
- Attentional Feature Fusion
- Throwing a question? The execution speed of the Count operation in the Mysql environment is very slow. You need to manually add an index to the primary key---MySql optimization 001
- xmms的歌词显示及音量控制OK
- Win系统 - 罗技 G604 鼠标蓝灯闪烁、失灵解决方案
- GeoScene Pro 2.1下载地址与安装基本要求
猜你喜欢
随机推荐
mongodb学习笔记
[贴装专题] 视觉贴装平台与贴装流程介绍
笔记本电脑使用常见问题,持续更新
源代码阅读器项目
snmp++编译错误问题解决方法
【原创】VMware Workstation实现Openwrt软路由功能,非ESXI,内容非常详细!
【报错记录】解决华擎J3455-ITX不插显示器无法开机的问题
SQL Server查询优化
Transformer+Embedding+Self-Attention原理详解
GeoScene Pro 2.1下载地址与安装基本要求
使用.NET简单实现一个Redis的高性能克隆版(四、五)
Qt 国际化翻译
【原创】JPA中@PrePersist和@PreUpdate的用法
学长告诉我,大厂MySQL都是通过SSH连接的
BERT预训练模型(Bidirectional Encoder Representations from Transformers)-原理详解
Throwing a question? The execution speed of the Count operation in the Mysql environment is very slow. You need to manually add an index to the primary key---MySql optimization 001
【原创】解决阿里云oss-browser.exe双击没反应打不开,提供一种解决方案
动态内存管理
antd的Table列选择、列拓展
1003 我要通过! (20 分)




![[项目配置] 配置Qt函数库和ui界面库的封装并调用的项目](/img/e9/d41f144a2f27e76f97cd6401d37578.png)



