【Linux编程】IO复用之poll详解
2015-12-06 23:02
603 查看
poll系统调用
poll系统调用和select非常相似,关于select的详解可以在本博客中找到,poll也是在一定时间内轮询监听用户感兴趣的文件描述符上的可读、可写和异常事件。poll系统调用原型
#include<poll.h> int poll(struct pollfd fdset[], nfds_t nfds, int timeout);
1)fdset参数是一个pollfd结构体类型的数组,其定义如下:
struct pollfd{ int fd; /*文件描述符,如果小于0。这个文件描述符将会被进程忽略*/ short events; /*注册的事件,即感兴趣的事件。可以是一个事件,也可以是多个事件的按位或*/ short revents; /*实际发生的事件,由内核来赋值。需要与某种类型的事件按位与来确定某种事件是否发生*/ };
这个结构体指定了我们感兴趣的文件描述符上发生的可读、可写和异常事件。
与select不同,poll不是为每个事件构造一个描述符集合,而是用一个pollfd结构体数组来指定用户感兴趣的文件描述符及其事件。
poll事件类型如下表:
自Linux内核2.6.17开始,GUN为poll系统调用增加了一个POLLRDHUP事件,它在socket上接收到对方关闭连接的请求之后触发,使用POLLRDHUP时,需要在代码最开始处定义 _GUN_SOURCE。
当然我们也可以通过read来判断对方是否关闭了连接,当read返回0时,表示对方请求关闭连接。
2)nfds参数指定了pollfd结构体数组fdset的大小,nfds_t是一个无符号长整型类型:
typedef unsigned long int nfds_t;
3)timeout参数指定poll的超时时间,单位是毫秒。
当timeout==-1时:永久等待,直到指定的描述符有事件发生或捕捉到信号时返回。
当timeout==0时:不等待,测试完所有描述符后立即返回。
当timeout>0时:等待指定的毫秒,在超时时间内,当指定的描述符有事件发生或捕捉到信号时返回。
poll返回值
poll的返回值含义与select相同。1)返回-1,表示出错,比如在等待期间捕捉到一个信号。
2)返回0,表示在超时时间内没有描述符准备好。
3)返回一个正值,表示已经准备好的描述符的数量。
poll函数的一个小实例
#include <stdio.h> #include <fcntl.h> #include <unistd.h> #include <poll.h> int main(){ struct pollfd fdset[1]; fdset[0].fd = 0; fdset[0].events = POLLIN; int ret; char buf[100]; while(1){ ret = poll(fdset, 1, -1); if(fdset[0].revents & POLLIN){ ret = read(0, buf, 100); printf("读取到%d个字节的数据%s", ret, buf); } } return 0; }
这个小实例主要是监听标准输入上的POLLIN事件,当我们在键盘上敲入数据时,会触发POLLIN事件,表示有数据可读,然后poll返回。由内核修改的fdset[0].revents与POLLIN相与判断是否发生了POLLIN事件,当为真则发生,就可以读取键盘上的输入数据了。
相关文章推荐
- Linux socket 初步
- linux lsof详解
- linux 文件权限
- Linux 执行数学运算
- 10 篇对初学者和专家都有用的 Linux 命令教程
- Linux 与 Windows 对UNICODE 的处理方式
- Ubuntu12.04下QQ完美走起啊!走起啊!有木有啊!
- 解決Linux下Android开发真机调试设备不被识别问题
- 运维入门
- 运维提升
- Linux 自检和 SystemTap
- Ubuntu Linux使用体验
- c语言实现hashmap(转载)
- Linux 信号signal处理机制
- linux下mysql添加用户
- Scientific Linux 5.5 图形安装教程
- 基于 Linux 集群环境上 GPFS 的问题诊断
- 谁是桌面王者?Win PK Linux三大镇山之宝
- vivi下重新调整分区