UNIX环境高级编程笔记(21)- I/O多路转接-select

 


前言

本章主要介绍I/O多路转接-select。


一、I/O多路转接

解决:I/O多路转接目的是解决同时阻塞多个文件描述的问题。

原理:构造一张我们感兴趣的描述符(通常都不止一个)的列表,然后调用一个函数,直到这些描述符中的一个已经准备好进行I/O时,改函数才返回。poll、pselect、select这三个函数使我们能够执行I/O多路转接。从这些函数返回时,进程会被告知哪些描述符已经准备好可以进行I/O。

二、select

#include <sys/seclect.h>

int select(int maxfdl, fd_set *restrict readfds, fd_set *restrict writefds, fd_set *restrict execptfds, struct timeval *restrict tvptr);

参数tvptr:指定愿意等待的时间长度,单位为秒和微妙

参数readfds、writefds、execptfds:指向描述符集的指针。这3个描述符说明了我们关心的可读、可写、处于异常条件的描述符集合。

返回值:-1表示出错、返回值0表示没有描述符准备好、返回值正值说明已经准备好的描述符。

准备好含义:

1.若对读集中的一个描述符进行的read操作不会阻塞,则认为此描述符是准备好的。

2.若对写集中的一个描述符进行的write操作不会阻塞,则认为此描述符是准备好的。

3.若对异常条件集中的一个描述符有一个未决异常条件,则认为此描述符是准备好的。

三、select函数的使用

1.描述符和描述符集的操作

1.描述符是否在描述符集中int FD_ISSET(int fd, fd_set *fset);//如fd在描述符集中,返回非0值;否者,返回02.清除描述符集中的一个描述符void FD_CLR(int fd, fd_set *fset);3.在描述符集中增加一个描述符void FD_SET(int fd, fd_set *fset);4.清空描述符集void FD_ZERO(fd_set *fset);

2.描述符添加

fd_set rset;
int fd; 
FD_ZERO(&rset);  //清空
FD_SET(fd,&rset);//添加fd到集rset中
FD_SET(STDIN_FILENO,&rset);//添加标准输入到集rset中 
if(FD_ISSET(fd,&rset)){
/*操作*/
} //从select返回时,可以用FD_ISSET测试该集中的一个给定位是否仍处于打开状态

3.select使用

fd_set readset, writeset;
FD_ZERO(&readset);  //清空
FD_ZERO(&writeset); //清空
FD_SET(0,&readset);//添加描述符0到集rset中
FD_SET(3,&readset);//添加描述符3到集rset中
FD_SET(1,&readset);//添加描述符1到集rset中
FD_SET(2,&readset);//添加描述符2到集rset中
select(4,&readset,&writeset,NULL,NULL);//阻塞等待四个描述

 


总结

本章主要介绍了I/O多路复用和select函数的使用。

上一篇:JDBC:JAVA & Oracle


下一篇:MVC+EF+Spring.Net代码生成器