当前位置:网站首页>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.
边栏推荐
- StratoVirt 中的虚拟网卡是如何实现的?
- [ASM] Bytecode operation MethodVisitor case combat generation object
- Transformer+Embedding+Self-Attention原理详解
- 公里周日
- 【原创】JPA中@PrePersist和@PreUpdate的用法
- 借问变量何处存,牧童笑称用指针,Go lang1.18入门精炼教程,由白丁入鸿儒,go lang类型指针(Pointer)的使用EP05
- 排序1:冒泡排序
- Redis 缓存主动更新策略
- 百度云大文件网页直接下载
- OpenGL ES2.0编程三部曲(转载自MyArrow)
猜你喜欢
3D printed this DuPont cable management artifact, and the desktop is no longer messy
循环嵌套以及列表的基本操作
[ASM] Bytecode operation MethodVisitor case combat generation object
electron 应用开发优秀实践
BERT预训练模型(Bidirectional Encoder Representations from Transformers)-原理详解
Cpolar内网穿透的面板功能介绍
【MySQL】mysql因为字符集导致left join出现Using join buffer (Block Nested Loop)
对话跨国消费品牌DPO:数据安全合规从何做起?8.11直播见!
字符串函数和内存函数
深度学习--自编码器(AutoEncoder)
随机推荐
Win7 远程桌面限制IP
[Halcon&定位] 解决Roi区域外的模板匹配成功
公里周日
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
判断一段文字的width
虚拟列表key复用问题
从源码分析UUID类的常用方法
阿里神作!吃透这份资料入厂率高达99%
Electron application development best practices
Redis + NodeJS 实现一个能处理海量数据的异步任务队列系统
技术分享 | 如何模拟真实使用场景?mock 技术来帮你
条件控制语句
程序员的专属浪漫——用3D Engine 5分钟实现烟花绽放效果
函数组件和类组件和dva视图更新问题
How to quickly get through the mirror release process?
Attentional Feature Fusion
壁纸
元组 字典 集合
WUSTOJ:n个素数构成等差数列
深度学习--循环神经网络(Recurrent Neural Network)