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函数的使用。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

默默的赶路人

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值