嵌入式 select函数实例

原创 2013年12月02日 14:45:39
select本事是非阻塞的,但是第四个参数是最多等待的时间,如果时间到了即使那个件事情没有发生,select仍然返回,当第四个参数为NULL时候,那么此时select为阻塞的
确定一个或多个套接口的状态,如需要则等待。
#include <<A style="COLOR: rgb(19,110,194); TEXT-DECORATION:none" href="http://baike.baidu.com/view/1640586.htm"target=_blank>winsock.h>
int PASCAL FAR select( int nfds, fd_set FAR* readfds, fd_set FAR*writefds, fd_set FAR* exceptfds, const struct timeval FAR*timeout);
nfds:是一个整数值,是指集合中所有文件描述符的范围,即所有文件描述符的最大值加1,不能错!在Windows中这个参数的值无所谓,可以设置不正确。
readfds:(可选)指针,指向一组等待可读性检查的套接口。
writefds:(可选)指针,指向一组等待可写性检查的套接口。
exceptfds:(可选)指针,指向一组等待错误检查的套接口。
timeout:select()最多等待时间,对阻塞操作则为NULL。

编辑本段注释

本函数用于确定一个或多个套接口的状态,对每一个套接口,调用者可查询它的可读性、可写性及错误状态信息,用fd_set结构来表示一组等待检查的套接口,在调用返回时,这个结构存有满足一定条件的套接口组的子集,并且select()返回满足条件的套接口的数目。有一组宏可用于对fd_set的操作,这些宏与BerkeleyUnix软件中的兼容,但内部的表达是完全不同的。
readfds参数标识等待可读性检查的套接口。如果该套接口正处于监听listen()状态,则若有连接请求到达,该套接口便被标识为可读,这样一个accept()调用保证可以无阻塞完成,对其他套接口而言,可读性意味着有排队数据供读取。或者对于SOCK_STREAM类型套接口来说,相对于该套接口的虚套接口已关闭,于是recv()或recvfrom()操作均能无阻塞完成,writefds参数标识等待可写性检查的套接口。如果一个套接口正在connect()连接(非阻塞),可写性意味着连接顺利建立。如果套接口并未处于connect()调用中,可写性意味着send()和sendto()调用将无阻塞完成。〔但并未指出这个保证在多长时间内有效,特别是在多线程环境中〕。
exceptfds参数标识等待带外数据存在性或意味错误条件检查的套接口,请注意如果设置了SO_OOBINLINE选项为假FALSE,则只能用这种方法来检查带外数据的存在与否,对于SO_STREAM类型套接口,远端造成的连接中止和KEEPALIVE错误都将被作为意味出错。如果套接口正在进行连接connect()(非阻塞方式),则连接试图的失败将会表现在exceptfds参数中。
如果对readfds、writefds或exceptfds中任一个组类不感兴趣,可将它置为空NULL。
在winsock.h头文件中共定义了四个宏来操作描述字集。FD_SETSIZE变量用于确定一个集合中最多有多少描述字(FD_SETSIZE缺省值为64,可在包含winsock.h前用#defineFD_SETSIZE来改变该值)。对于内部表示,fd_set被表示成一个套接口的队列,最后一个有效元素的后续元素为INVAL_SOCKET。宏为:FD_CLR(s,*set):从集合set中删除描述字s。FD_ISSET(s,*set):若s为集合中一员,非零;否则为零。FD_SET(s,*set):向集合添加描述字s。FD_ZERO(*set):将set初始化为空集NULL。
timeout参数控制select完成的时间。若timeout参数为空指针,则select将一直阻塞到有一个描述字满足条件,否则的话,timeout指向一个timeval结构,其中指定了select调用在返回前等待多长时间。如果timeval为{0,0},则select立即返回,这可用于探询所选套接口的状态,如果处于这种状态,则select调用可认为是非阻塞的,且一切适用于非阻塞调用的假设都适用于它,举例来说,阻塞钩子函数不应被调用,且WINDOWS套接口实现不应yield。

编辑本段返回值

select()调用返回处于就绪状态并且已经包含在fd_set结构中的描述字总数;如果超时则返回0;否则的话,返回SOCKET_ERROR错误,应用程序可通过WSAGetLastError获取相应错误代码。
当返回位-1时,所有描述符集清0。
当返回为0时,超时不修改任何描述符集。
当返回为非0时,在3个描述符集里,依旧是1的位就是准备好的描述符。这也就是为什么,每次用select后都要用FD_ISSET的原因。

编辑本段错误代码

WSANOTINITIALISED:在使用此API之前应首先成功地调用WSAStartup()。WSAENETDOWN:WINDOWS套接口实现检测到网络子系统失效。WSAEINVAL:超时时间值非法,WSAEINTR:通过一个WSACancelBlockingCall()来取消一个阻塞的WSAEINPROGRESS:一个阻塞的WINDOWS套接口调用正在运行中。WSAENOTSOCK:描述字集合中包含有非套接口的元素。

编辑本段调用

使用"select()+from"的语句,从网页中调用数据库文件,如从数据库中的某一张数据表中调用一列数据,select(表列)from(表)。是常用的SQL语句,用于SQL数据查询,但也用于动态网页调用数据表,以实现网页交互的功能。

编辑本段相关参考

WSAAsyncSelect(),accept(),connect(), recv(), recvfrom(),send()。

编辑本段事件用法

概述

触发每一个匹配元素的select事件
这个函数会调用执行绑定到select事件的所有函数,包括浏览器的默认行为。可以通过在某个绑定的函数中返回false来防止触发浏览器的默认行为。

返回值

jQuery

示例

触发所有input元素的select事件:
jQuery 代码:
$("input").select();

嵌入式 信号机制经典详解以及示例

一,前言  信号是进程之间互传消息的一种方法俗称软件中断。很多比较重要的应用程序都需处理信号。信号提供了一种  处理异步事件的方法:终端用户键入中断键,则会通过信号机构停止一个程序。所以,信号可...
  • skdkjxy
  • skdkjxy
  • 2013年12月05日 09:47
  • 1268

select函数详细用法解析

1.表头文件 #include #include #include 2.函数原型 int select(int n,fd_set * readfds,fd_set * writefds,fd_s...
  • guozhiyingguo
  • guozhiyingguo
  • 2016年10月24日 15:39
  • 1757

select函数使用浅析

一、函数原型及参数说明     int select(int maxfdp, fd_set *readfds, fd_set *writefds, fd_set *errorfds, struct ...
  • silent123go
  • silent123go
  • 2016年09月18日 19:32
  • 1180

嵌入式 select函数详解Linux

select() 在 SOCKET 编程中还是比较重要的,可是对于初学 SOCKET 的人来说都不太爱用 select() 写程序,他们只是习惯写诸如 conncet()、accept()、recv(...
  • skdkjxy
  • skdkjxy
  • 2013年12月02日 14:43
  • 492

嵌入式 Linux时间函数

Linux的时间函数  一、时间相关说明 格林威治时间表示0时区的标准时间。其他时区的时间和此标准时间均有时间差。UTC(Universal Time Coordinated)是世界协调时间,是格...
  • skdkjxy
  • skdkjxy
  • 2013年12月02日 14:52
  • 1078

linux之select函数用法详解

select系统调用是用来让我们的程序监视多个文件句柄(file descriptor)的状态变化的。程序会停在select这里等待,直到被监视的文件句柄有某一个或多个发生了状态改变。   何为文件句...
  • qq_21792169
  • qq_21792169
  • 2016年01月03日 10:23
  • 14284

select函数用法详解(以例子剖析)

先看例子: Examples: /* * This example opens a console and a serial port for * read mode, and calls sel...
  • qq_16124631
  • qq_16124631
  • 2014年06月06日 20:33
  • 1326

玩转重要的select函数并分析其行为

说明:  尽管select函数在Windows和Linux上的用法有些差异, 且这些差异值得我们特别注意, 但从功能上来讲, 他们还是差不多的。 本文, 我们仅仅考虑Windows上的select函数...
  • stpeace
  • stpeace
  • 2015年01月21日 21:56
  • 2751

select监听多个客户端 -- linux函数

使用select函数可以以非阻塞的方式和多个socket通信。程序只是演示select函数的使用,功能非常简单,即使某个连接关闭以后也不会修改当前连接数,连接数达到最大值后会终止程序。 1. 程序使...
  • ccy365263452
  • ccy365263452
  • 2015年07月11日 11:35
  • 2088

select函数详解及实例分析

原文链接:http://blog.csdn.net/leo115/article/details/8097143 Select函数在Socket编程中还是比较重要的,可是对于初学Socket...
  • zimiao815
  • zimiao815
  • 2016年10月13日 13:33
  • 445
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:嵌入式 select函数实例
举报原因:
原因补充:

(最多只允许输入30个字)