matlab select函数,select函数

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

阻塞方式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句柄里的数据 */

}

……

}

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/208531.html原文链接:https://javaforall.net

(0)
上一篇 2026年3月19日 上午11:22
下一篇 2026年3月19日 上午11:22


相关推荐

  • scrollIntoView()的用法[通俗易懂]

    scrollIntoView()的用法[通俗易懂]STARTscrollIntoView是一个与页面(容器)滚动相关的API(官方解释),该API只有boolean类型的参数能得到良好的支持(firefox36+都支持),所以在这里只讨论参数Boolean类型的情况。EXPLAIN调用方法为element.scrollIntoView()参数默认为true。参数为true时调用该函数,页面(或容器)发生滚动,使elem…

    2022年6月18日
    44
  • Python数据处理案例

    Python数据处理案例关于数据处理案例有两个 第一个案例是我整理到有道云上的 就直接剪切下来了 下面直接进入正题 案例 1 快餐数据案例 2 欧洲杯数据先进行数据探索 data info data describe 查看数据集是否有缺失值且哪个字段存在缺失值 可以用下面的代码 也可以用前面案例 1 缺失值那里提到的前两种方法 foriinrange d

    2025年6月23日
    4
  • C# 互斥锁 Mutex

    C# 互斥锁 Mutex当两个或更多线程需要同时访问一个共享资源时,系统需要使用同步机制来确保一次只有一个线程使用该资源。Mutex 是同步基元,它只向一个线程授予对共享资源的独占访问权。如果一个线程获取了互斥体,则要获取该互斥体的第二个线程将被挂起,直到第一个线程释放该互斥体。privatestaticMutexmut=newMutex();两个线程访问资源需要互斥时,两个线程都要用互斥锁。

    2022年6月26日
    57
  • JavaScript如何获得input元素value值

    JavaScript如何获得input元素value值转载地址 http aquarius zf iteye com blog 在页面中我们最常见的页面元素就是 input 了 但是我们如何用 JavaScript 得到网页 input 中输入的 value 值呢 其实很简单 方法也不止一种 据我总结比较常用的就是下面的两种方法 闲话不多说了 下面那就来看看我说的方法吧 方法一 Java 代码

    2026年3月20日
    2
  • linux安装软件报错: Can’t locate ExtUtils/Embed.pm in @INC…

    linux安装软件报错: Can’t locate ExtUtils/Embed.pm in @INC…

    2021年10月29日
    47
  • 一款GEO AI优化系统,支持关键词蒸馏、自动创作、多平台投喂与收录验证,让品牌在DeepSeek、豆包等大模型中被优先推荐

    一款GEO AI优化系统,支持关键词蒸馏、自动创作、多平台投喂与收录验证,让品牌在DeepSeek、豆包等大模型中被优先推荐

    2026年3月12日
    3

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号