`
hulianwang2014
  • 浏览: 686565 次
文章分类
社区版块
存档分类
最新评论
  • bcworld: 排版成这样,一点看的欲望都没有了
    jfinal

第六章:I/O复用:select和poll函数

 
阅读更多

第六章I/O复用:select和poll函数

1 unix提供给我们的五种IO模型:

阻塞I/O模型:阻塞I/O例如函数recvfrom的内核到应用层、应用层到内核的调用过程是这样的:首先把描述符、接受数据缓冲地址、大小传递给内核,但是如果此时该与该套接口相应的缓冲区没有数据,这个时候就recvfrom就会卡在这里,当数据到来的时候,再把数据拷贝到应用层,也就是传进来的地址空间,如果没有数据到来,就会使该函数阻塞在那里,这就叫做阻塞I/O模型,如下图:

非阻塞I/O模型:就是如果recvfrom从应用层到内核的时候,此时与传进来的套接字相应的缓冲区还没有数据的时候,这个时候就告诉内核,如果该缓冲区没有数据的话,就直接给我返回,并且返回一个错误是EWOULDBLOCK,一般都对非阻塞I/O模型进行轮询,就是一直在检查这个状态,看内核是不是有数据到来调用过程如下图


I/O复用模型:就是设置一组套接字,如果这些套接字有一个以上出现了可读、可写、或者异常select都会返回,这个时候,可以检查室哪个套接字状态达到了,因为select函数的套接字集是 值=结果的,当select返回的时候,集合中的套接字是变化的,这个返回的套接字是满足要求的,通常程序的做法是,对想要了解的套接字,进行分开处理

使用select的好处是:能够等待多个套接字准备好。


信号驱动I/O模型:当内核为我们准备好数据的时候,就会发送SIGIO信号,我们可以调用sigaction安装SIGIO信号的处理函数,这个时候就可以在SIGIO信号处理函数中进行recvfrom函数来接受数据报


异步I/O模型:是让内核拷贝完之后通知我们。信号驱动I/O是当内核准备好数据的时候,通知我们可以调用recvfrom了,而异步I/O模型是内核通知我们I/O操作完成的时候通知我们。


select函数:这个函数允许指示内核等待多个事件中的人一个发生,并仅在一个或多个事件发生或者经过某指定事件后在唤醒进程。

intselect(int maxfd1, fd_set *readset, fd_set* writeset, fd_set *exceptset, conststruct timeval * timeout)

中的描述符不仅仅是套接口还可以是任何描述符

timeout指定了等待的时间:当取 NULL指针的时候代表的是无限时间等待

当取0的时候是立即返回

当不是以上情况的时候,就等待timeout的时间,如果没有满足 的套接口就返回了。

设置描述符集的函数有

voidFD_ZERO(fd_set *fdset);清空描述符集

voidFD_SET(int fd, fd_set* fd_set);把fd加入到fd_set描述符集中

voidFD_CLR(int fd, fd_set* fd_set);把fd删除

voidFD_ISSET(int fd, fd_set* fdset);判断fd是不是fdset字符集的描述符


分享到:
评论

相关推荐

    Unix网络编程 第6章 I/O服用: select和poll函数 第6章.tar.gz 对本章的代码简易的练习

    I/O复用:select和poll函数 对本章的代码练习

    UNIX网络编程第1卷(1-19章)

    第六章 I/O复用:select和poll函数 第七章 套接口选项 第八章 基本UDP套接口编程 第九章 基本名字与地址转换 第十章 IPv4和Ipv6的互操作性 第十一章 高级名字与地址转换 第十二章 守护进程和inetd超级服务器 第十三...

    UNIX网络编程 第2卷 进程间通信 带完整书签

    第6章 I/O复用:select和poll函数 第7章 套接口选项 第8章 基本UDP套接口编程 第9章 基本SCTP套接口编程 第10章 SCTP客户/服务器程序例子 第11章 名字与地址转换 第3部分 高级套接口编程? 第12章 IPv4与IPv6...

    UNIX网络编程 第2卷 进程间通信.pdf(带书签)

    第6章 I/O复用:select和poll函数 第7章 套接口选项 第8章 基本UDP套接口编程 第9章 基本SCTP套接口编程 第10章 SCTP客户/服务器程序例子 第11章 名字与地址转换 第3部分 高级套接口编程? 第12章 IPv4与IPv6的互...

    UNIX网络编程 卷1:套接字联网API

    第6章 I/O复用:select和poll函数 第7章 套接字选项 第8章 基本UDP套接字编程 第9章 基本SCTP套接字编程 第10章 SCTP客户/服务器程序例子 第11章 名字与地址转换 第三部分 高级套接字编程 第12章 ...

    UNIX网络编程卷2进程间通信(第2版)

    第6章 I/O复用:select和poll函数 第7章 套接口选项 第8章 基本UDP套接口编程 第9章 基本SCTP套接口编程 第10章 SCTP客户/服务器程序例子 第11章 名字与地址转换 第3部分 高级套接口编程? 第12章 IPv4与IPv6的互操作...

    UNIX网络编程卷1:套接字联网API(第3版)part1 共2部分

    第6章 IO复用:select和poll函数 第7章 套接字选项 第8章 基本UDP套接字编程 第9章 基本SCTP套接字编程 第10章 SCTP客户/服务器程序例子 第11章 名字与地址转换 第三部分 第12章 IPv4与IPv6的互操作性 第13...

    linux内核select/poll,epoll实现与区别

    select,poll,epoll都是多路复用IO的函数,简单说就是在一个线程里,可以同时处理多个文件描述符的读写。 select/poll的实现很类似,epoll是从select/poll扩展而来,主要是为了解决select/poll天生的缺陷。 epoll在...

    socket网络编程-epoll-水平触发和边缘触发源码

    (2)epoll技术的性能,可以说非常惊艳,它是能够使单台计算机支撑数百万甚至数十万上百万并发的核心技术,远优于其他I/O模型或I/O函数(如select、poll函数),select和poll这类技术因为系统内部实现问题,当并发...

    EPOLL模型:关于并发连接的处理

    Linux 2.6内核中提高网络I/O性能的新方法-epoll I/O多路复用技术在比较多的TCP网络服务器中有使用,即比较多的用到select函数。 1、为什么select落后  首先,在Linux内核中,select所用到的FD_SET是有限的,即内核...

    linux programming instances网络编程教程 附源代码

    全书由13章组成,内容涉及到Lindx系统编程基础、TCP/UDP协议、套接字编程概念及I/O模型、高级编程中需要用到的进程问通信同步、多路复用、多线程编程和一些高级套接字控制方法、IPv6介绍以及网络安全等。...

    UNIX网络编程 卷2:进程间通信

     第6章 System V消息队列 103  6.1 概述 103  6.2 msgget函数 104  6.3 msgsnd函数 104  6.4 msgrcv函数 105  6.5 msgctl函数 106  6.6 简单的程序 107  6.7 客户-服务器例子 112  6.8 复用消息 113  6.9 ...

    linux 下 select 编程 librtspserver

    linux 下 select 编程 我们知道 select 是IO 多路复用的一个最简单支持,poll 和 epoll 是 select 的升级版。在 UNIX 网络编程第五章读书笔记 我们遇到这样一个问题:当客户端阻塞在 fgets() 等待客户输入的时候,...

    Linux高性能服务器编程

    包含Linux网络编程API、高级I/O函数、Linux服务器程序规范、高性能服务器程序框架、I/O复用、信号、定时器、高性能I/O框架库Libevent、多进程编程、多线程编程、进程池和线程池等内容,原理、技术与方法并重;...

    UNIX网络编程 卷2 进程间通信 带完整书签,完整目录

    第6章 System V消息队列 103 6.1 概述 103 6.2 msgget函数 104 6.3 msgsnd函数 104 6.4 msgrcv函数 105 6.5 msgctl函数 106 6.6 简单的程序 107 6.7 客户-服务器例子 112 6.8 复用消息 113 6.9 消息队列...

    《UNIX网络编程 第2版. 第2卷, 进程间通信(中文版)》(W·Richard Stevens[美] 著)

    第6章 System V消息队列 103 6.1 概述 103 6.2 msgget函数 104 6.3 msgsnd函数 104 6.4 msgrcv函数 105 6.5 msgctl函数 106 6.6 简单的程序 107 6.7 客户-服务器例子 112 6.8 复用消息 113 6.9 消息队列上使用select...

    UNIX网络编程 第2卷 进程间通信

    第6章 System V消息队列 103 6.1 概述 103 6.2 msgget函数 104 6.3 msgsnd函数 104 6.4 msgrcv函数 105 6.5 msgctl函数 106 6.6 简单的程序 107 6.7 客户-服务器例子 112 6.8 复用消息 113 6.9 消息队列上使用select...

    UNIX 高级教程系统技术内幕

    第6 章 进程间通信(130) 6.1 简介 6.2 通用IPC 方法 6.2.1 信号 6.2.2 管道 6.2.3 SVR4 的管道 6.2.4 进程跟踪 6.3 System V 的进程间通信 6.3.1 公共元素 6.3.2 信号量 6.3.3 消息队列 6.3.4 共享内存 6.3.5 讨论 ...

    C++从0实现百万并发Reactor服务器完结13章下载

    reactor中的 IO 使用的是select poll epoll 多路复用IO, 以便提高 IO 事件的处理能力,提高IO事件处理效率,支持更高的并发 。 二、Reactor 模型有三个重要的组件: 多路复用器:由操作系统提供,在 linux 上一般是...

    IO多路复用之poll全面总结(必看篇)

    1、基本知识 poll的机制与select类似,与select在本质上没有多大差别...2、poll函数 函数格式如下所示: # include <poll> int poll ( struct pollfd * fds, unsigned int nfds, int timeout); pollfd结构体定义如下:

Global site tag (gtag.js) - Google Analytics