Select

  1. #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);

  1. FD_CLR(int fd, fd_set *set);
  1. FD_ISSET(int fd, fd_set *set);
  1. FD_SET(int fd, fd_set *set);
  2. 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 的这两个值都被设为零,则此调用会立即返回,报告此调用进行的时候是否有任何事件等待处理,但是不会等待其后的任何事件。

  1. fd_set writefds;
  1. FD_ZERO(&writefds);
    FD_SET(fd,&writefds); //将fd加入分组
  1. FD_CLR(fd,&writedfds); //从分组移除fd
  1. FD_ISSET(fd,&writefds); //测试特定文件描述符是否已就绪
  1. #include <stdio.h>
  2. #include <sys/time.h>
  3. #include <sys/types.h>
  4. #include <unistd.h>
  5.  
  6. #define TIMEOUT 5
  7. #define BUF_LEN 1024
  8.  
  9. int main()
  10. {
  11. struct timeval tv;
  12. fd_set readfds;
  13.  
  14. FD_ZERO(&readfds);
  15. FD_SET(STDIN_FILENO, &readfds);
  16.  
  17. tv.tv_sec = TIMEOUT;
  18. tv.tv_usec = ;
  19.  
  20. ret = select (STDIN_FILENO+, &readfds, NULL,NULL,&tv);
  21.  
  22. if (FD_ISSET (STDIN_FILENO, &readfds)) {
  23. char buf[BUF_LEN+];
  24. int len = read(STDIN_FILENO, buf, BUF_LEN);
  25.  
  26. buf[len] = ;
  27. printf("read:%s\n",buf);
  28. }
  29. }
  1.  

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 所指定的文件描述符无效

例子:

  1. #include <stdio.h>
  2. #include <unistd.h>
  3. #include <sys/poll.h>
  4.  
  5. #define TIMEOUT 5
  6.  
  7. int main()
  8. {
  9. struct pollfd fds[];
  10. int ret;
  11.  
  12. fds[].fd = STDIN_FILENO;
  13. fds[].events = POLLIN;
  14.  
  15. fds[].fd = STDOUT_FILENO;
  16. fds[].events = POLLOUT;
  17.  
  18. int a;
  19. //scanf("%d",&a);
  20. ret = poll(fds,,TIMEOUT*);
  21.  
  22. if (!ret) {
  23. perror("poll");
  24. return ;
  25. }
  26.  
  27. if (!ret) {
  28. printf("%d seconds elapsed. \n", TIMEOUT);
  29. return ;
  30. }
  31.  
  32. if (fds[].revents & POLLIN)
  33. printf("stdin is readable\n");
  34.  
  35. if (fds[].revents & POLLOUT)
  36. printf("stdout is writable\n");
  37. scanf("%d",&a);
  38. return ;
  39. }

Linux下I/O复用 Select与Poll的更多相关文章

  1. linux下多路复用模型之Select模型

    Linux关于并发网络分为Apache模型(Process per Connection (进程连接) ) 和TPC , 还有select模型,以及poll模型(一般是Epoll模型) Select模 ...

  2. I/O复用——select和poll

    概述 I/O多路复用(multiplexing)的本质是通过一种机制(系统内核缓冲I/O数据),让单个进程可以监视多个文件描述符,一旦某个描述符就绪(一般是读就绪或写就绪),能够通知程序进行相应的读写 ...

  3. 以python理解Linux的IO多路复用,select、poll、epoll

    题外话 之前在看Unix环境高级编程的时候,看完高级IO那一章,感觉自己萌萌哒,0.0 ,有点囫囵吞枣的感觉,之后翻了几篇博客,从纯系统的角度理解,稍微有了点概念,以这两篇为例,可以以后参考: htt ...

  4. linux文件读写 文件锁、select、poll【转】

    本文转载自:http://blog.csdn.net/fansongy/article/details/6853395 一.文件锁 文件锁用于多个用户共同使用或操作同一个文件.有读锁的时候可以再加读锁 ...

  5. IO复用: select 和poll 到epoll

    linux 提供了select.poll和epoll三种接口来实现多路IO复用.下面总结下这三种接口. select 该函数允许进程指示内核等待多个事件中的任何一个发生,并只在有一个或多个事件发生或经 ...

  6. Linux NIO 系列(04-4) select、poll、epoll 对比

    目录 一.API 对比 1.1 select API 1.2 poll API 1.3 epoll API 二.总结 2.1 支持一个进程打开的 socket 描述符(FD)不受限制(仅受限于操作系统 ...

  7. socket阻塞与非阻塞,同步与异步、I/O模型,select与poll、epoll比较

    1. 概念理解 在进行网络编程时,我们常常见到同步(Sync)/异步(Async),阻塞(Block)/非阻塞(Unblock)四种调用方式: 同步/异步主要针对C端: 同步:      所谓同步,就 ...

  8. Linux 下的五种 IO 模型

    概念说明 用户空间与内核空间 现在操作系统都是采用虚拟存储器,那么对32位操作系统而言,它的寻址空间(虚拟存储空间)为4G(2的32次方).操作系统的核心是内核,独立于普通的应用程序,可以访问受保护的 ...

  9. linux 下 epoll 编程

    转载自 Linux epoll模型 ,这篇文章讲的非常详细! 定义: epoll是Linux内核为处理大批句柄而作改进的poll,是Linux下多路复用IO接口select/poll的增强版本,它能显 ...

随机推荐

  1. Web前端开发实战6:CSS实现导航菜单结合二级下拉式菜单的简单变换

    前面几篇博文都在讲导航菜单和二级下拉式菜单,事实上有非常多方法都能够实现的.详细的情况还要视情况而定. 在后面学习到jQuery框架之后,会有更丰富的动画效果.因为在学习Ajax和jQuery的初步阶 ...

  2. '无法将“vue”项识别为 cmdlet、函数、脚本文件或可运行程序的名称' 或 'vue不是内部或外部命令' 的解决方法

    如果在使用 vue 初始化项目的时候提示: vue : 无法将“vue”项识别为 cmdlet.函数.脚本文件或可运行程序的名称.请检查名称的拼写,如果包括路径,请确保路径正确,然后再试一次. 或者: ...

  3. Android ADB 常用命令

    Android ADB 常用命令 泛原罪 2016.09.21 00:02* 字数 605 阅读 2912评论 0喜欢 1 [TOC] adb logcat 查看日志 详细内容可参见 ADB Usag ...

  4. tiny4412开机动画、开机界面的定制 【原创】

    关键词:Android  linux 开机logo 开机动画  平台信息:内核:linux3.0.68 系统:android/android5.1平台:tiny4412 作者:庄泽彬(欢迎转载,请注明 ...

  5. 搜索分析(DFS、BFS、递归、记忆化搜索)

    搜索分析(DFS.BFS.递归.记忆化搜索) 1.线性查找 在数组a[]={0,1,2,3,4,5,6,7,8,9,10}中查找1这个元素. (1)普通搜索方法,一个循环从0到10搜索,这里略. (2 ...

  6. Redis Sentinel哨兵配置

    概述 Redis-Sentinel是Redis官方推荐的高可用性(HA)解决方案,当用Redis做Master-slave的高可用方案时,假如master宕机了,Redis本身(包括它的很多客户端)都 ...

  7. Boolean占几个字节

    Boolean:1.1bit 2.1byte 3.4byte 简书地址:  http://www.jianshu.com/p/2f663dc820d0 官网地址:       http://docs. ...

  8. WordPress音乐主题Always1.8

    WordPress响应式主题 音乐主题个人博客杂志主题Always主题V1.8 Always主题V1.8是以Ajax加以CSS动画的方式,很好的将优雅的设计感和极度精简的代码同时表现了出来,进而缔造出 ...

  9. Java 类 对象 包

    Java类和对象 类是具有相同属性和行为的一组对象的集合.(属性是用来描述对象的特征可以理解为成员变量 例如:一个学生(对象)他的类可能是学校,它的属性可能是学号,姓名,年龄,班级,成绩等等) 例子: ...

  10. UVa1585修改版

    #include<stdio.h> int main() { int i,k=-1; char a[100]; while(scanf("%s",&a)!=EO ...