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的更多相关文章

  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. <vim实用技巧>学习笔记

    第三章插入模式 1.插入模式下的删除  2.返回普通模式                                 3.复制 yt, //复制当前光标到逗号(,)之前的内容 第四章 可视模式 1 ...

  2. Android开机动画、logo、字样的定制过程【转】

    本文转载自:http://blog.csdn.net/yinhaide/article/details/43668401 Android开机画面总共有三屏 一.第一屏:开机logo 1.选张png格式 ...

  3. k8s 安装并试用Istio service mesh

    本文根据官网的文档整理而成,步骤包括安装istio 0.5.1并创建一个bookinfo的微服务来测试istio的功能. 文中使用的yaml文件可以在kubernetes-handbook的manif ...

  4. [.Net] Excel导入导出各种方式分析

    1.引言 1.1解决哪些问题   现在很多公司用的导出基本上采用的通过gridView导出excel,此种导出存在以下几种问题 1.数据量大的时候有时导出有时会让浏览器卡死,因为导出的excel不是真 ...

  5. POJ-3061 Subsequence 二分或尺取

    题面 题意:给你一个长度为n(n<100000)的数组,让你找到一个最短的连续子序列,使得子序列的和>=m  (m<1e9) 题解: 1 显然我们我们可以二分答案,然后利用前缀和判断 ...

  6. 你要的 React 面试知识点,都在这了

    摘要: 问题很详细,插图很好看. 原文:你要的 React 面试知识点,都在这了 作者:前端小智 Fundebug经授权转载,版权归原作者所有. React是流行的javascript框架之一,在20 ...

  7. 20. Valid Parentheses[E]有效的括号

    题目 Given a string containing just the characters '(',')','[',']','{' and '}',determine if the input ...

  8. linq的教程

    http://www.cnblogs.com/lifepoem/archive/2011/12/16/2288017.html

  9. [Offer收割]编程练习赛41

    比赛日程安排 #pragma comment(linker, "/STACK:102400000,102400000") #include<stdio.h> #incl ...

  10. 如何在Hexo中实现自适应响应式相册功能

    用最清晰简洁的方法整合一个响应式相册 效果 技术选型 由于我选用的主题使用了fancyBox作为图片弹出展示的框架,查看后表示很不错,能满足需要 http://fancyapps.com/fancyb ...