阻塞方式block,就是进程或是线程执行到这些函数时必须等待某个事件的发生,如果事件没有发生,进程或线程就被阻塞,函数不能立即返回。使用Select就可以完成非阻塞non-block,就是进程或线程执行此函数时不必非要等待事件的发生,一旦执行肯定返回,以返回值的不同来反映函数的执行情况,如果事件发生则与阻塞方式相同,若事件没有发生则返回一个代码来告知事件未发生,而进程或线程继续执行,所以效率较高。select能够监视我们需要监视的文件描述符的变化情况。

(一)首先说明两个结构体:

1:struct fd_set一个存放文件描述符(file descriptor),即文件句柄的聚合,实际上是一long类型的数组,

每一个数组元素都能与一打开的文件句柄(不管是Socket句柄,还是其他文件或命名管道或设备句柄)建立联系,建立联系的工作由程序员完成;

FD_ZERO(fd_set *fdset):清空fdset与所有文件句柄的联系。

FD_SET(int fd, fd_set *fdset):建立文件句柄fd与fdset的联系。

FD_CLR(int fd, fd_set *fdset):清除文件句柄fd与fdset的联系。

FD_ISSET(int fd, fdset *fdset):检查fdset联系的文件句柄fd是否可读写,>0表示可读写。

2:struct timeval用来代表时间值,有两个成员,一个是秒数tv_sec,另一个是毫秒数tv_usec。

(二)下面介绍select()函数原型:

1:int select(int nfds, fd_set *rdfds, fd_set *wtfds, fd_set *exfds, struct timeval *timeout)

2:ndfs:select中监视的文件句柄数,一般设为要监视的文件中的最大文件号加一。

3:rdfds:select()监视的可读文件句柄集合,当rdfds映象的文件句柄状态变成可读时系统告诉select函数返回。

这个集合中有一个文件可读,select就会返回一个大于0的值,表示有文件可读,

如果没有可读的文件,则根据timeout参数再判断是否超时,

若超出timeout的时间,select返回0,若发生错误返回负值,

可以传入NULL值,表示不关心任何文件的读变化;

4:wtfds: select()监视的可写文件句柄集合,当wtfds映象的文件句柄状态变成可写时系统告诉select函数返回。

如果这个集合中有一个文件可写,select就会返回一个大于0的值,表示有文件可写,

如果没有可写的文件,则根据timeout参数再判断是否超时,

若超出timeout的时间,select返回0,若发生错误返回负值,

可以传入NULL值,表示不关心任何文件的写变化。

5:exfds:select()监视的异常文件句柄集合,当exfds映象的文件句柄上有特殊情况发生时系统会告诉select函数返回。

6:timeout:select()的超时结束时间。

这个参数它使select处于三种状态,

第一,若将NULL以形参传入,即不传入时间结构,就是将select置于阻塞状态,

一定等到监视文件描述符集合中某个文件描述符发生变化为止;

第二,若将时间值设为0秒0毫秒,就变成一个纯粹的非阻塞函数,不管文件描述符是否有变化,

都立刻返回继续执行,文件无变化返回0,有变化返回一个正值;

第三,timeout的值大于0,这就是等待的超时时间,即select在timeout时间内阻塞,

超时时间之内有事件到来就返回了,否则在超时后不管怎样一定返回,返回值同上述。

7:返回值:负值:select错误

0:等待超时,没有可读写或错误的文件

正值:某些文件可读可写或出错

(三)下面是一个有三个套接字句柄的例子

int sa, sb, sc;

sa = socket(...);

connect(sa,...);

sb = socket(...);

connect(sb,...);

sc = socket(...);

connect(sc,...);

FD_SET(sa, &rdfds);/* 分别把3个句柄加入读监视集合里去 */

FD_SET(sb, &rdfds);

FD_SET(sc, &rdfds);

int maxfd = 0;

if(sa > maxfd) maxfd = sa;/* 获取3个句柄的最大值 */

if(sb > maxfd) maxfd = sb;

if(sc > maxfd) maxfd = sc;

struct timeval tv;

tv.tv_sec   = ... ;

tv.tv_usec = ...;

ret = select(maxfd + 1, &rdfds, NULL, NULL, &tv); /* 注意是最大值加1 */

if(ret

{

perror("select");  /* select函数出错 */

}

else if(ret == 0)

{

printf("超时\n"); /* 在设定的tv时间内,socket的状态没有发生变化 */

}

else

{

printf("ret=%d\n", ret);

if(FD_ISSET(sa, &rdfds)) /* 先判断一下sa这个被监视的句柄是否真的变成可读的了 */

{

recv(...);  /* 读取socket句柄里的数据 */

}

......

}

matlab select函数,select函数相关推荐

  1. 第6章 I/O复用 select 和 poll 函数

    I/O 复用的能力: 如果一个或多个 I/O 条件满足(例如,输入已准备好被读,或者描述字可以承接更多的输出)时,我们就被通知到. I/O 复用由函数 select 和 poll 支持. I/O 复用 ...

  2. select、bash函数初识及rpm命令详解

    一.循环的特殊用法及select 二.bash函数基础 三.rpm命令 一.循环的特殊用法及select 1)while循环的特殊用法(遍历文件的每一行):  while read line; do ...

  3. jQuery选择文本事件函数– select()方法

    jQuery select() method triggers when a text in the text field or text area is selected. This method ...

  4. linux的poll_wait函数,select() 与 poll()两个函数接口的作用

    select()函数的作用 系统调用select和poll的后端实现,用这两个系统调用来查询设备是否可读写,或是否处于某种状态.如果poll为空,则驱动设备会被认为即可读又可写,返回值是一个状态掩码 ...

  5. Linux中select函数的使用 select() Linux linux函数 select

    阻塞式I/O编程有两个特点: 一.如果一个发现I\O有输入,读取的过程中,另外一个也有了输入,这时候不会产生任何反应.这就需要你的程序语句去用到select函数的时候才知道有数据输入. 二.程序去se ...

  6. inet_aton mysql_MySQL_IP处理函数inet_aton()和inet_ntoa()使用说明,MYSql的IP对int的转换函数 select i - phpStudy...

    IP处理函数inet_aton()和inet_ntoa()使用说明 MYSql的IP对int的转换函数 select inet_aton(ip) from table_name; 网络地址: 192. ...

  7. MySQL讲义第 40 讲——select 查询之函数(3):数学函数

    MySQL讲义第40讲--select 查询之函数(3):数学函数 文章目录 MySQL讲义第40讲--select 查询之函数(3):数学函数 一.数据准备 二.MySQL 数学函数介绍 1.ABS ...

  8. MySQL讲义第 39 讲——select 查询之函数(2):日期时间型函数

    MySQL讲义第39讲--select 查询之函数(2):日期时间型函数 文章目录 MySQL讲义第39讲--select 查询之函数(2):日期时间型函数 一.数据准备 二.MySQL 日期时间型函 ...

  9. I/O复用:select和poll函数

    <UNIX网络编程卷1:套接字联网API(第3版)> - 第6章- I/O复用 I/O模型 在介绍select和poll两个函数之前, 整体回顾下Unix下5种I/O模型的基本区别 阻塞式 ...

  10. mysql within 函数_SQL基础----(四)复杂的子查询(select within select)

    (一) 关键知识点 1.1 消化阶梯任何知识点,均可遵循此消化路径 1.2 功能点 1.2.1 视图案例选中视图,右键刷新,将会呈现新创建的视图选中具体视图,右键弹出功能菜单,选择对应功能项注意事项 ...

最新文章

  1. cacti系列(一)之cacti的安装及配置监控mysql服务
  2. php 经纬度 摩卡 转换,WGS84经纬度坐标与WEB摩卡托坐标转换
  3. Java 爬虫--类似Python的requests库--HttpClient, HttpAsyncClient--Maven
  4. 神经科学家发现神经元网络可以拉伸或压缩其活动以控制时间
  5. python学了有什么用处-python教程有什用《学习python有什么好的用处》
  6. 对人工智能问题的提问
  7. 生成元(Digit Generator ,ACM/ICPC Seoul 2005 ,UVa 1583)
  8. 【视频课】生成对抗网络经典任务,详解基于GAN的图像生成算法!
  9. [转]FFT倒序算法—雷德算法
  10. Yii实现分页的两种方法
  11. 五家共井java_算法练习02:五家共井
  12. Windows Mobile,用C#更改网络连接(SSID、IP Address、Subnet Mask、Gatew... (转)
  13. 复频域求零输入响应_第十四章 动态电路的复频域分析 习题答案
  14. 推销员(codevs 5126)
  15. 【iOS开发】理解 IBOutlet 和 IBAction
  16. 解决Nginx出现403 forbidden
  17. 2018.08.22 NOIP模拟 string(模拟)
  18. 搏一搏,单车变摩托!华为天才少年耗时四月将自行车强势升级为自动驾驶
  19. samba 指定的网络名不再可用
  20. 2021年12月电子学会图形化四级编程题解析含答案:棕熊大战

热门文章

  1. nowcoder2018年全国多校算法寒假训练营练习比赛(第一场)
  2. inception-v3模型神经网络图片识别系统搭建详细流程(2)
  3. PyCharm打开csv文件中文乱码
  4. python文件闪退_python运行窗口闪退(python打开文件出现闪退什么原因)
  5. Python 华为机考真题【用户调度问题】分值【Q2-200】
  6. 解决KVM中鼠标不同步问题
  7. Windows下Snort的配置
  8. 常用,易用,好看的第三方控件(.NET)
  9. BH1750程序测试
  10. 如何搭建团队知识库?试试这款开源项目