【Unix网络编程】chapter6 IO复用:select和poll函数

chapter6
6.1 概述
I/O复用典型使用在下列网络应用场合。
(1):当客户处理多个描述符时,必须使用IO复用
(2):一个客户同时处理多个套接字是可能的,不过不叫少见。
(3):如果一个TCP服务器既要处理监听套接字,又要处理已连接套接字。
(4):如果一个服务器既要处理TCP,又要处理UDP
(5):如果一个服务器要处理多个服务或多个协议
IO复用并非只限于网络,许多重要的应用程序也需要使用这项技术。

6.2 I/O模型
在Unix下可用的5种I/O模型的基本区别:
(1)阻塞式I/O
(2)非阻塞式I/O
(3)I/O复用(select和poll)
(4)信号驱动式I/O(SIGIO)
(5)异步I/O(POSIX的aio_系列函数)
6.2.1 阻塞式I/O
6.2.2 非阻塞式I/O模型
6.2.3 I/O复用模型
有个I/O复用,我们就可以调用select或poll,阻塞在这两个系统调用中的某一个之上,而不是阻塞在真正的I/O系统调用上。
6.2.4 信号驱动式I/O模型
我们也可以用信号,让内核在描述符就绪时发送SIGIO信号通知我们。我们称这种模型为信号驱动式I/O
6.2.5 异步I/O模型
6.3 select函数
该函数允许进程指示内核等待多个事件中的任何一个发生,并且在有一个或多个事件发生或经历一段指定的时间后才唤醒它。
我们调用select告知内核对那些描述符(就读写或异常)感兴趣以及等待多长时间。
#include <sys/select.h>
#include <sys/time.h>
int select(int maxfdp1, fd_set *readset, fd_set *writeset, fd_set *exceptset, cosnt struct timeval *timeout);
struct timeval
{
long tv_sec; //秒
long tv_usec;//微妙
};

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);

时间: 2024-10-07 11:17:05

【Unix网络编程】chapter6 IO复用:select和poll函数的相关文章

Unix网络编程之IO复用

上篇存在的问题 在上一篇TCP套接字中,还存在着一些问题. 当客户端连接上服务器后,阻塞于从标准输入读入信息的状态,若此时服务器进程被杀死,即使给客户TCP发来一个 FIN结束分节,但是由于客户处于阻塞状态,它将看不到这个EOF,直到读取之后,此时可能已经过去了很长时间. 因此进程需要一种能力,让内核同时检测多个IO口是否就绪,这个能力就称为IO复用.这是由select和poll两个函数 支持的. select函数 作用 允许进程指示内核等待多个事件中的任何一个发生,并只在有一个或多个事件发生或

Unix网络编程随手记——套接字接口函数

套接字接口(socket interface)是一组函数,它们和Unix I/O函数结合起来,用以创建网络应用.大多数现代系统上都实现套接字接口,包括所有的Unix变种.Windows和Macintosh. 1.套接字的基本结构 struct sockaddr 这个结构用来存储套接字地址. 数据定义: 1 struct sockaddr 2 { 3 unsigned short sa_family; /* address族, AF_xxx */ 4 char sa_data[14]; /* 14

Unix网络编程 高级IO套接字设置超时

我们知道,对于一个套接字的读写(read/write)操作默认是阻塞的,如果当前套接字还不可读/写,那么这个操作会一直阻塞下去,这样对于一个需要高性能的服务器来说,是不能接受的.所以,我们可以在进行读写操作的时候可以指定超时值,这样就读写操作就不至于一直阻塞下去. 在涉及套接字的I/O操作上设置超时的方法有三种: 1:调用alarm,它在指定的超时期满时产生SIGALRM信号.这个方法涉及信号处理,而信号处理在不同的实现上存在差异,而且可能干扰进程中现有的alarm调用. 2:在select中阻

【unix网络编程第三版】阅读笔记(五):I/O复用:select和poll函数

本博文主要针对UNP一书中的第六章内容来聊聊I/O复用技术以及其在网络编程中的实现 1. I/O复用技术 I/O多路复用是指内核一旦发现进程指定的一个或者多个I/O条件准备就绪,它就通知该进程.I/O复用适用于以下场合: (1) 当客户处理多个描述符(一般是交互式输入或网络套接字),必须适用I/O复用 (2) 当一个客户处理多个套接字时,这种情况很少见,但也可能出现 (3) 当一个TCP服务器既要处理监听套接字,又要处理已连接套接字,一般就要使用I/O复用 (4) 如果一个服务器既要适用TCP,

UNIX网络编程笔记(5)—I/O复用select/poll

I/O复用:select和poll函数 1. 概述 考虑一种情况,当客户端阻塞于fgets调用时,服务器进程被杀死:此时服务器TCP虽然正确地给客户TCP发送了一个FIN,但是由于客户进程阻塞于标准输入的过程,直到从套接字读时为止.这样的进程就需要一种机制,使得内核一旦发现进程指定的一个或多个I/O条件就绪,就通知进程.这个能力就叫做I/O复用.由select和poll函数支持的. I/O复用典型使用在下列网络应用场合: (1)客户处理多个描述符. (2) 客户通知处理多个套接字. (3) 服务

UNIX网络编程入门——I/O复用

UNIX网络编程入门--TCP客户/服务器程序详解 UNIX网络编程入门--TCP客户/服务器程序存在问题及解决 在介绍I/O复用之前,我们先来看一个情况:运行我们前面两篇文章里面的服务器和客户端程序,当客户端在等待用户输入一行字符时,服务器崩溃或者关机了.此时虽然服务器TCP会正确地发送FIN给客户端TCP,但客户端阻塞于fget函数,等待从标准输入读入,无法及时地知道服务器已经终止,要等到它得到标准输入发送给服务器时才会返回错误. 要解决这个问题,就需要一种能力,能够同时观察多个I/O条件是

UNIX网络编程——网络I/O模型

在学习UNIX网络编程的时候.一開始分不清 同步 和 异步,所以还是总结一下,理清下他们的差别比較好. IO分类 IO依据对IO的调度方式可分为堵塞IO.非堵塞IO.IO复用.信号驱动IO.异步IO. IO操作整个流程分为 可操作推断 和 实际IO操作 两个区间,我们能够称之为两个半程,前半程推断是否可操作,后半程进行实际操作. 当中堵塞IO.非堵塞IO.IO复用.信号驱动IO由于其[实际的IO操作是同步堵塞]的,所以一般把他们归为同步IO,异步IO的实际IO操作是在独立的线程中完毕的,所以称为

【实习记】2014-08-25版本管理svn与git学习对比+看书UNIX网络编程

git也算中等熟练了,对其哲学也明白.但是svn一直半桶水. 上网搜索了几篇svn的好文,做一下总结: <svn分支开发与主干合并(branch & merge) >http://blog.csdn.net/bbirdsky/article/details/24620155 TortoiseSVN图形操作,适合初学者. <SVN中Branch的创建与合并>http://www.cnblogs.com/huang0925/p/3254243.html命令行的svn,适合真正要

unix网络编程各种TCP客户-服务器程序设计实例附环境搭建和编译方法(一)

一,到http://download.csdn.net/detail/ts173383201/4505201去下载源代码,然后解压: 二,cd到你解压后的文件夹下,就是有configure的那个目录下,执行命令./configure: 三,执行cd lib跳到lib目录下,执行make命令,会在上层目录(就是刚才有configure那个目录)生成libunp.a文件 四,复制这个静态库libunp.a到/usr/lib/和/usr/lib64/中; 五,接下来在目录中找到unp.h和config

Unix网络编程中的五种I/O模型_转

转自:Unix网络编程中的的五种I/O模型 下面主要是把unp第六章介绍的五种I/O模型. 1. 阻塞I/O模型 例如UDP函数recvfrom的内核到应用层.应用层到内核的调用过程是这样的:首先把描述符.接受数据缓冲地址.大小传递给内核,但是如果此时 该与该套接口相应的缓冲区没有数据,这个时候就recvfrom就会卡(阻塞)在这里,知道数据到来的时候,再把数据拷贝到应用层,也就是传进来的地址空 间,如果没有数据到来,就会使该函数阻塞在那里,这就叫做阻塞I/O模型,如下图: 2. 非阻塞I/O模