Linux下I/O复用 Select与Poll
Select
#include <sys/time.h>
#include <sys/types.h>
#include <sys/unistd.h>
int select (int n, fd_set readfds, fd_set writefds, fd_set exceptfds, struct timeval timeout);
FD_CLR(int fd, fd_set *set);
FD_ISSET(int fd, fd_set *set);
FD_SET(int fd, fd_set *set);
FD_ZERO(fd_set *set);
调用select 将受到阻塞,必须等到指定的文件描述符就绪可进行I/O,或者等到一个指定的事件限额过去。
此调用所监视的文件描述符分为三种事件类型,每个等待不同的事件。readfds中的文件描述符是准备读取的;writefds 分组中的文件描述符是准备写入数据的; exceptfds 分组的中的文件描述符是用于查看是否有异常发生或紧急数据可用。这三个分组可以是NULL,在此情况下 select() 将无法监视相应的事件。
此调用返回后,每个分组只会包含就绪可进行I/O的文件描述符。
第一个参数 n 等于任何分组中最高编号的文件描述符的值加1。
timeout 参数是一个指向 timeval 结构的指针,该结构的定义如下:
struct timeval {
long tv_sec;
seconds long tv_usec;
microseconds
};
如果此参数不是 NULL,则 select() 调用将在 tv_sec 秒与 tv_usec 微秒之后返回,即使尚无任何文件描述符就绪可进行I/O。如果 timeout 的这两个值都被设为零,则此调用会立即返回,报告此调用进行的时候是否有任何事件等待处理,但是不会等待其后的任何事件。
fd_set writefds;
FD_ZERO(&writefds);
FD_SET(fd,&writefds); //将fd加入分组
FD_CLR(fd,&writedfds); //从分组移除fd
FD_ISSET(fd,&writefds); //测试特定文件描述符是否已就绪
#include <stdio.h>
#include <sys/time.h>
#include <sys/types.h>
#include <unistd.h> #define TIMEOUT 5
#define BUF_LEN 1024 int main()
{
struct timeval tv;
fd_set readfds; FD_ZERO(&readfds);
FD_SET(STDIN_FILENO, &readfds); tv.tv_sec = TIMEOUT;
tv.tv_usec = ; ret = select (STDIN_FILENO+, &readfds, NULL,NULL,&tv); if (FD_ISSET (STDIN_FILENO, &readfds)) {
char buf[BUF_LEN+];
int len = read(STDIN_FILENO, buf, BUF_LEN); buf[len] = ;
printf("read:%s\n",buf);
}
}
poll
#include <sys/poll.h>
int poll (struct pollfd *fds, unsigned int nfds, int timeout);
struct pollfd {
int fd; //文件描述符
short events; //所要查看的事件
short revents; //返回所目击事件
};
每个 pllfd 结构可用于制定一个要查看的文件描述符。每个pollfd结构的 events 字段是该文件描述符所要查看事件的位掩码,用户可以设定此字段。而 revents 字段则是该文件描述符所目击事件的位掩码,内核会在返回时设定此字段。
有效事件包括:
POLLIN 有数据可供读取
OLLRDNORM 有一般数据可供读取
POLLRDBAND 有优先数据可供读取
POLLPRI 有紧急数据可供读取
POLLOUT 写入操作将不受阻塞
POLLWRNORM 写入一般数据将不受组阻塞
POLLWRBAND 写入优先数据将不受阻塞
POLLMSG 有SIGPOLL消息可用
POLLER 所指定的文件描述符发生错误
POLLHUP 所指定的文件描述符发生挂起事件
POLLNVAL 所指定的文件描述符无效
例子:
#include <stdio.h>
#include <unistd.h>
#include <sys/poll.h> #define TIMEOUT 5 int main()
{
struct pollfd fds[];
int ret; fds[].fd = STDIN_FILENO;
fds[].events = POLLIN; fds[].fd = STDOUT_FILENO;
fds[].events = POLLOUT; int a;
//scanf("%d",&a);
ret = poll(fds,,TIMEOUT*); if (!ret) {
perror("poll");
return ;
} if (!ret) {
printf("%d seconds elapsed. \n", TIMEOUT);
return ;
} if (fds[].revents & POLLIN)
printf("stdin is readable\n"); if (fds[].revents & POLLOUT)
printf("stdout is writable\n");
scanf("%d",&a);
return ;
}
Linux下I/O复用 Select与Poll的更多相关文章
- linux下多路复用模型之Select模型
Linux关于并发网络分为Apache模型(Process per Connection (进程连接) ) 和TPC , 还有select模型,以及poll模型(一般是Epoll模型) Select模 ...
- I/O复用——select和poll
概述 I/O多路复用(multiplexing)的本质是通过一种机制(系统内核缓冲I/O数据),让单个进程可以监视多个文件描述符,一旦某个描述符就绪(一般是读就绪或写就绪),能够通知程序进行相应的读写 ...
- 以python理解Linux的IO多路复用,select、poll、epoll
题外话 之前在看Unix环境高级编程的时候,看完高级IO那一章,感觉自己萌萌哒,0.0 ,有点囫囵吞枣的感觉,之后翻了几篇博客,从纯系统的角度理解,稍微有了点概念,以这两篇为例,可以以后参考: htt ...
- linux文件读写 文件锁、select、poll【转】
本文转载自:http://blog.csdn.net/fansongy/article/details/6853395 一.文件锁 文件锁用于多个用户共同使用或操作同一个文件.有读锁的时候可以再加读锁 ...
- IO复用: select 和poll 到epoll
linux 提供了select.poll和epoll三种接口来实现多路IO复用.下面总结下这三种接口. select 该函数允许进程指示内核等待多个事件中的任何一个发生,并只在有一个或多个事件发生或经 ...
- Linux NIO 系列(04-4) select、poll、epoll 对比
目录 一.API 对比 1.1 select API 1.2 poll API 1.3 epoll API 二.总结 2.1 支持一个进程打开的 socket 描述符(FD)不受限制(仅受限于操作系统 ...
- socket阻塞与非阻塞,同步与异步、I/O模型,select与poll、epoll比较
1. 概念理解 在进行网络编程时,我们常常见到同步(Sync)/异步(Async),阻塞(Block)/非阻塞(Unblock)四种调用方式: 同步/异步主要针对C端: 同步: 所谓同步,就 ...
- Linux 下的五种 IO 模型
概念说明 用户空间与内核空间 现在操作系统都是采用虚拟存储器,那么对32位操作系统而言,它的寻址空间(虚拟存储空间)为4G(2的32次方).操作系统的核心是内核,独立于普通的应用程序,可以访问受保护的 ...
- linux 下 epoll 编程
转载自 Linux epoll模型 ,这篇文章讲的非常详细! 定义: epoll是Linux内核为处理大批句柄而作改进的poll,是Linux下多路复用IO接口select/poll的增强版本,它能显 ...
随机推荐
- 自定义控件三部曲之动画篇(四)——ValueAnimator基本使用
前言:不要让别人的无知断送了你的梦想,永远坚信你所坚信的. 相关文章: <Android自定义控件三部曲文章索引>:http://blog.csdn.net/harvic880925/ar ...
- Linux - 设置光盘,开机自动挂载。
设置光盘,开机自动挂载. 挂载, 在linux操作系统中, 挂载是指将一个设备(通常是存储设备)挂接到一个已存在的目录上. 我们要访问存储设备中的文件,必须将文件所在的分区挂载到一个已存在的目录上, ...
- 产生冠军--hdoj
产生冠军 Time Limit : 1000/1000ms (Java/Other) Memory Limit : 32768/32768K (Java/Other) Total Submissi ...
- 杂项:hive(数据仓库工具)
ylbtech-杂项:hive(数据仓库工具) hive是基于Hadoop的一个数据仓库工具,可以将结构化的数据文件映射为一张数据库表,并提供简单的sql查询功能,可以将sql语句转换为MapRedu ...
- 免费获取Bootstrap模板的方法
Bootstrap是Twitter推出的一个开源的用于前端开发的工具包,其中中包含了丰富的Web组件,根据这些组件,可以快速的搭建一个漂亮.功能完备的网站. 最近通过了Bootstrap中文网学习了其 ...
- king枚举帮助类
可以方便的实现枚举 枚举 public enum DeptType { [Description("科室1")] Professional = , [Description(&qu ...
- C#中DataSet中的relation
//关系定义的方法是 DataRelation 变量名 = “DataSet对象”.Relations.Add("关系名",DataSet对象.主表.列名 , DataSet对象. ...
- [Offer收割]编程练习赛42
对局匹配 直接贪心 #pragma comment(linker, "/STACK:102400000,102400000") #include<stdio.h> #i ...
- Android 拍照图片选取与图片剪裁
最近从以前的项目中扒下来一个常用的模块,在这里有必要记录一下的,就是android上获取图片以及裁剪图片,怎么样?这个功能是不是很常用啊,你随便打开一个App,只要它有注册功能都会有设置人物头像的功能 ...
- BluetoothA2dp蓝牙音箱的连接
1:权限 <uses-feature android:name="android.hardware.bluetooth_le" android:required=" ...