select

#include <sys/select.h>
#include <sys/time.h> int select(int maxfdp1, fd_set *readset, fd_set *writeset, fd_set exceptset, const struct timeval *timeout);
  • timeout 设置等待就绪IO的超时时间。有三种可能:

    1. NULL 一直等待直到某个IO就绪
    2. 等待固定的时间
    3. 不等待,立即返回,此时timeout里的成员值都为0
  • readset, writeset, exceptset 指定读、写、异常条件的描述符,如果这三个参数都为NULL,则select相当于一个更精确的sleep。三个参数都是描述符集,通常是整数数组,其中每一个bit代表一个描述符。有四个相关宏:

void FD_ZERO(fd_set *fdset);
void FD_SET(int fd, fd_set *fdset);
void FD_CLR(int fd, fd_set *fdset);
int FD_ISSET(int fd, fd_set *fdset);
  • 待测试描述符个数。它的值是待测试的最大描述符加1.

select返回值有三种可能:

  1. 超时返回,返回值为0
  2. IO就绪返回,返回值为描述符集中就绪的总位数。
  3. 出错返回-1

套接字描述符何时就绪?

读就绪:

  1. 有数据可读,套接字接收缓冲区中的数据字节大于等于套接字接收缓冲区低水位标记的当前大小。此时读操作将读到数据,将返回一个大于0的数值。
  2. 连接的读半部关闭。read返回0,表示EOF
  3. 监听套接字且已完成的连接数不为0,此时accept通常不会阻塞
  4. 有一个错误待出理,此时读操作将返回-1,同时errno置为确切的错误条件。

写就绪:

  1. 缓冲区有空间可写。
  2. 连接的写半部关闭。此时写操作将产生SIGPIPE信号
  3. 使用非阻塞式connect的套接字已建立连接,或者connect已经失败告终
  4. 套接字上有错误待处理。写操作将返回-1.

当某个套接字上发生错误时,select将其标记为即可读又可写。

poll

#include <poll.h>

int poll(struct pollfd *fdarray, unsigned long nfds, int timeout);
struct pollfd {
int fd;
short events;
short revents;
};

6. IO复用:select 和 poll的更多相关文章

  1. (转)Linux Network IO Model、Socket IO Model - select、poll、epoll

    Linux Network IO Model.Socket IO Model - select.poll.epoll  原文:https://www.cnblogs.com/LittleHann/p/ ...

  2. Linux Network IO Model、Socket IO Model - select、poll、epoll

    目录 . 引言 . IO机制简介 . 阻塞式IO模型(blocking IO model) . 非阻塞式IO模型(noblocking IO model) . IO复用式IO模型(IO multipl ...

  3. I/O模型系列之五:IO多路复用 select、poll、epoll

    IO多路复用之select.poll.epoll IO多路复用:通过一种机制,一个进程可以监视多个描述符,一旦某个描述符就绪(一般是读就绪或者写就绪),能够通知程序进行相应的读写操作. 应用:适用于针 ...

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

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

  5. IO多路复用 select、poll、epoll

    什么是IO多路复用 在同一个线程里面, 通过拨开关的方式,来同时传输多个(socket)I/O流. 在英文中叫I/O multiplexing.这里面的 multiplexing 指的其实是在单个线程 ...

  6. IO模式 select、poll、epoll

    阻塞(blocking).非阻塞(non-blocking):最常听到阻塞与非阻塞这两个词就是在函数调用中,比如waitid这个函数,通过NOHANG参数可以把waitid设置为非阻塞的,也就是问询一 ...

  7. io复用select方法编写的服务器

    摘要:io多路复用是通过一种机制,可以监视多个描述符,一旦某个描述符就绪(一般都是读就绪或者写就绪),就能通知应用程序进行相应的读写操作.select函数作为io多路复用的机制,第一个参数nfds是f ...

  8. Linux下I/O复用 Select与Poll

    Select #include <sys/time.h>#include <sys/types.h>#include <sys/unistd.h> int sele ...

  9. IO复用——select系统调用

    1.select函数 此函数用于在一段时间内,监听用户感兴趣的文件描述符上的可读.可写和异常等事件. #include<sys/select.h> int select(int nfds, ...

  10. IO复用: select 和poll 到epoll

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

随机推荐

  1. luogu3761 [TJOI2017]城市

    重点是求树的直径.半径. 参考这里 #include <iostream> #include <cstring> #include <cstdio> using n ...

  2. main()中的参数argc, argv

    转自:http://blog.csdn.net/eastmount/article/details/20413773 一.main()函数参数 通常我们在写主函数时都是void main()或int ...

  3. Palindromic Paths(DP)

    描述 Given an N×N grid of fields (1≤N≤500), each labeled with a letter in the alphabet. For example: A ...

  4. MySQL5.7多源复制实践

    MySQL5.7开始新增多源复制功能,即允许一个salve同时复制多个主库的事务,slave会创建通往每个主库的管道.多源复制在应用来自多个源的事务的时候不会对有冲突的事务进行检测. 配置实现 主库支 ...

  5. BZOJ 2286 [Sdoi2011]消耗战 ——虚树

    虚树第一题. 大概就是建一颗只与询问有关的更小的新树,然后在虚树上DP #include <map> #include <ctime> #include <cmath&g ...

  6. BZOJ 1197: [HNOI2006]花仙子的魔法【DP】

    Description 相传,在天地初成的远古时代,世界上只有一种叫做“元”的花.接下来,出 现了一位拥有魔法的花仙子,她能给花附加属性,从此,“元”便不断变异,产生了大千世界千奇百怪的各种各样的花. ...

  7. 【php wamp的配置】

  8. Linux(9):期中架构(1)--- 集群构架 & 备份服务

    01. 了解集群架构服务器组成 基本架构组成:(用于让用户进行访问) # 前端服务部分: 1)顾客-用户 是一个访问者,请求访问网站页面 2)保安-防火墙设备 对访问架构用户进行策略控制,正常访问网站 ...

  9. Spring Batch 文档(中文)

    http://blog.csdn.net/shorn/article/category/1186181

  10. android:logo

    <?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="ht ...