高级轮询技术——/dev/poll接口与kqu…
来源:互联网 发布:au视频软件下载 编辑:程序博客网 时间:2024/06/10 00:46
这里介绍两种机制,它们跟select和poll这两个函数具备类似的特性。
/dev/poll接口
Solaris上名为/dev/poll的特殊文件提供了一个可扩展的轮询大量描述符的方法。select和poll存在的一个问题是,每次调用它们都得传递待查询的文件描述符。轮询设备能在调用之间维持状态,因此轮询进程可以预先设置好待查询描述符的列表,然后进入一个循环等待事件发生,每次循环回来时不必再次设置该列表。
打开/dev/poll之后,轮询进程必须先初始化一个pollfd结构(即poll函数使用的结构,不过本机制不使用其中的revents成员)数组,再调用write往/dev/poll设备上写这个结构数组以把它传递给内核,然后执行DP_POLL命令阻塞自身以等待事件发生。
传递给ioctl调用的结构如下:
struct
};
其中dp_fds成员指向一个缓冲区,供ioctl在返回时存放一个pollfd结构数组。dp_nfds成员指定该缓冲区。ioctl调用将一直阻塞到任何一个被轮询描述符上发生所关心的事件,或者流逝时间超过经由dp_timeout成员指定的毫秒数为止。dp_timeout指定为0将导致ioctl立即返回,从而提供了使用本接口的非阻塞手段。dp_timeout指定为-1表示没有超时设置。
以下利用/dev/poll机制对函数str_cli进行改编。
#include
#include
void
str_cli(FILE
{
}
kqueue接口
FreeBSD引入了kqueue接口。本接口允许进程向内核注册描述所关注kqueue事件的事件过滤器。事件除了与select所关注类似的文件I/O和超时外,还有异步I/O、文件修改通知(例如文件被删除或修改时发出的通知)、进程跟踪(例如进程调用exit或fork时发出的通知)和信号处理。kqueue接口有如下两个函数和一个宏。
#include
#include
#include
int
int
void
kqueue函数返回一个新的kqueue描述符,用于后续的kevent调用中。kevent函数既用于注册所关注的事件,也用于确定是否有所关注的事件发生。changelist和nchanges这两个参数给出对所关注事件做出的更改,若无更改则分别取值NULL和0。如果nchanges不为0,kevent函数就执行changelist数组中所请求的每个事件过滤器更改。其条件已经触发的任何事件(包括刚在changelist中增设的那些事件)由kevent函数通过eventlist参数返回,它指向一个由nevents个元素构成的kevent结构数组。kevent函数在eventlist中返回的事件数目作为函数返回值返回,0表示超时。超时通过timeout参数设置,其处理类似select:NULL阻塞进程,非0值timespec指定明确的超时值,0值timespec执行非阻塞事件检查。注意,kevent使用的timespec结构不同于select使用的timeval结构,前者的分辨率为纳秒,后者的分辨率为微秒。
kevent结构在头文件中定义:
struct
};
其中的flags成员在调用时指定过滤器更改行为,在返回时额外给出条件,如下图所示。
filter成员指定的过滤器类型如下图所示。
以下利用kqueue机制对函数str_cli进行改编。
void
str_cli(FILE
{
}
- 高级轮询技术——/dev/poll接口与kqu…
- 高级轮询技术-poll
- 高级字符驱动程序操作——poll和select
- UNIX环境高级编程——select、poll和epoll
- 完稿—单片机原理与接口技术
- PHP高级——抽象类与接口的区别
- PHP高级——抽象类与接口的区别
- select与poll的接口说明
- poll接口
- poll, select & poll—wait底层数据结构
- C++——接口与实现分离技术
- UNIX环境高级编程——I/O多路转接(select、pselect和poll)
- 深入研究socket编程(6)——高级I/O复用(select、poll 、 epoll)
- Linux设备驱动程序——高级字符驱动程序操作(poll机制)
- WebSocket原理 与long poll、ajax轮询比较
- 《嵌入式系统原理与接口技术》——嵌入式系统接口应用基础
- 《C语言接口与实现》实验——高级字符串(Text_T)
- 面向对象高级——instanceof关键字的使用以及抽象类与接口的应用
- mutable关键字
- 析构函数为什么要写成虚函数
- 结构与联合
- C/C++文件读写
- select与pselect的信号屏蔽
- 高级轮询技术——/dev/poll接口与kqu…
- 套接字和标准I/O
- Java - 包 - 成员访问修饰符
- recvmsg和sendmsg函数
- connect的UDB套接字
- 给套接字设置超时检测
- 避免僵死进程
- 环境淬炼远见
- (转)vector中使用erase删除…