首页技术select函数(select函数的应用场景)

select函数(select函数的应用场景)

编程之家2026-06-06765次浏览

这篇文章给大家聊聊关于select函数,以及select函数的应用场景对应的知识点,希望对各位有所帮助,不要忘了收藏本站哦。

select函数(select函数的应用场景)

《c语言》中select函数的作用是什么

selcet函数是一个轮循函数,即当循环询问文件节点,可设置超时时间,超时时间到了就跳过代码继续往下执行。

select()的机制中提供一fd_set的数据结构,实际上是一long类型的数组,每一个数组元素都能与一打开的文件句柄(不管是Socket句柄,还是其他文件或命名管道或设备句柄)建立联系,建立联系的工作由程序员完成,当调用select()时,由内核根据IO状态修改fd_set的内容,由此来通知执行了select()的进程哪一Socket或文件可读或可写。主要用于Socket通信当中。

select的详细介绍

Select的函数格式(我所说的是Unix系统下的伯克利socket编程,和windows下的有区别,一会儿说明):

int select(int maxfdp,fd_set*readfds,fd_set*writefds,fd_set*errorfds,struct timeval*timeout);

先说明两个结构体:

第一,struct fd_set可以理解为一个集合,这个集合中存放的是文件描述符(filedescriptor),即文件句柄,这可以是我们所说的普通意义的文件,当然Unix下任何设备、管道、FIFO等都是文件形式,全部包括在内,所以毫无疑问一个socket就是一个文件,socket句柄就是一个文件描述符。

select函数(select函数的应用场景)

fd_set集合可以通过一些宏由人为来操作,比如

清空集合FD_ZERO(fd_set*);

将一个给定的文件描述符加入集合之中FD_SET(int,fd_set

*);

将一个给定的文件描述符从集合中删除FD_CLR(int

,fd_set*);

select函数(select函数的应用场景)

检查集合中指定的文件描述符是否可以读写FD_ISSET(int,fd_set*)。一会儿举例说明。

第二,struct timeval是一个大家常用的结构,用来代表时间值,有两个成员,一个是秒数,另一个是微妙数。

具体解释select的参数:

int maxfdp是一个整数值,是指集合中所有文件描述符的范围,即所有文件描述符的最大值加1,不能错!在Windows中这个参数的值无所谓,可以设置不正确。

fd_set*readfds是指向fd_set结构的指针,这个集合中应该包括文件描述符,我们是要监视这些文件描述符的读变化的,即我们关心是否可以从这些文件中读取数据了,如果这个集合中有一个文件可读,select就会返回一个大于0的值,表示有文件可读,如果没有可读的文件,则根据timeout参数再判断是否超时,若超出timeout的时间,select返回0,若发生错误返回负值。可以传入NULL值,表示不关心任何文件的读变化。

fd_set*writefds是指向fd_set结构的指针,这个集合中应该包括文件描述符,我们是要监视这些文件描述符的写变化的,即我们关心是否可以向这些文件中写入数据了,如果这个集合中有一个文件可写,select就会返回一个大于0的值,表示有文件可写,如果没有可写的文件,则根据timeout参数再判断是否超时,若超出timeout的时间,select返回0,若发生错误返回负值。可以传入NULL值,表示不关心任何文件的写变化。

fd_set*errorfds同上面两个参数的意图,用来监视文件错误异常。

struct timeval*timeout是select的超时时间,这个参数至关重要,它可以使select处于三种状态,第一,若将NULL以形参传入,即不传入时间结构,就是将select置于阻塞状态,一定等到监视文件描述符集合中某个文件描述符发生变化为止;第二,若将时间值设为0秒0毫秒,就变成一个纯粹的非阻塞函数,不管文件描述符是否有变化,都立刻返回继续执行,文件无变化返回0,有变化返回一个正值;第三,timeout的值大于0,这就是等待的超时时间,即select在timeout时间内阻塞,超时时间之内有事件到来就返回了,否则在超时后不管怎样一定返回,返回值同上述。

返回值:

负值:select错误

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

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

在有了select后可以写出像样的网络程序来!举个简单的例子,就是从网络上接受数据写入一个文件中。

例子:

main()

{

int sock; int fd;

fd_set fds;

struct timeval timeout={0,3};//select等待3微秒,3微秒轮询,要非阻塞就置0

char buffer[256]={0};//256字节的接收缓冲区

/*假定已经建立UDP连接,具体过程不写,简单,当然TCP也同理,主机ip和port都已经给定,要写的文件已经打开

sock=socket(...);

bind(...);

fd=open(...);*/

while⑴

{

FD_ZERO(&fds);//每次循环都要清空集合,否则不能检测描述符变化

FD_SET(sock,&fds);//添加描述符

FD_SET(fd,&fds);//同上

timeout.tv_sec=3;

timeout.tv_usec=0;//select函数会不断修改timeout的值,所以每次循环都应该重新赋值[windows不受此影响]

maxfdp=sock>fd?sock+1:fd+1;//描述符最大值加1

switch(select(maxfdp,&fds,&fds,NULL,&timeout))//select使用

{

case-1: exit(-1);break;//select错误,退出程序

case 0:break;//再次轮询

default:

if(FD_ISSET(sock,&fds))//测试sock是否可读,即是否网络上有数据

{

recvfrom(sock,buffer,256,.....);//接受网络数据

if(FD_ISSET(fd,&fds))//测试文件是否可写

write(fd,buffer...);//写入文件

buffer清空;

}// end if break;

}// end switch

}//end while

}//end main

select()函数与Linux驱动程序的关系

当用户调用select系统调用时,select系统调用会先调用poll_initwait(&table),然后调用驱动程序中 struct file_operations下的fop->poll函数,在这个函数里应该调用poll_wait(),将current加到某个等待队列(这里调用poll_wait()),并检查是否有效,如果无效就调用schedule_timeout();去睡眠。事件发生后,schedule_timeout()回来,调用fop->poll(),检查到可以运行,就调用poll_freewait(&table);从而完成select系统调用。重要的是fop->poll()里面要检查是否就绪,如果是,要返回相应标志。

select SQL 语言中常用的合计函数有哪些

聚合函数是对一组值执行计算并返回单一的值的函数,它经常与SELECT语句的GROUP BY子句一同使用,SQL SERVER中具体有哪些聚合函数呢?我们来一一看一下:

AVG返回指定组中的平均值,空值被忽略。

例:select prd_no,avg(qty) from sales group by prd_no

2. COUNT返回指定组中项目的数量。

例:select count(prd_no) from sales

3. MAX返回指定数据的最大值。

例:select prd_no,max(qty) from sales group by prd_no

4. MIN返回指定数据的最小值。

例:select prd_no,min(qty) from sales group by prd_no

5. SUM返回指定数据的和,只能用于数字列,空值被忽略。

例:select prd_no,sum(qty) from sales group by prd_no

6. COUNT_BIG返回指定组中的项目数量,与COUNT函数不同的是COUNT_BIG返回bigint值,而COUNT返回的是int值。

例:select count_big(prd_no) from sales

7. GROUPING产生一个附加的列,当用CUBE或ROLLUP运算符添加行时,输出值为1.当所添加的行不是由CUBE或ROLLUP产生时,输出值为0.

例:select prd_no,sum(qty),grouping(prd_no) from sales group by prd_no with rollup

8. BINARY_CHECKSUM返回对表中的行或表达式列表计算的二进制校验值,用于检测表中行的更改。

例:select prd_no,binary_checksum(qty) from sales group by prd_no

9. CHECKSUM_AGG返回指定数据的校验值,空值被忽略。

例:select prd_no,checksum_agg(binary_checksum(*)) from sales group by prd_no

10. CHECKSUM返回在表的行上或在表达式列表上计算的校验值,用于生成哈希索引。

11. STDEV返回给定表达式中所有值的统计标准偏差。

例:select stdev(prd_no) from sales

12. STDEVP返回给定表达式中的所有值的填充统计标准偏差。

例:select stdevp(prd_no) from sales

13. VAR返回给定表达式中所有值的统计方差。

例:select var(prd_no) from sales

14. VARP返回给定表达式中所有值的填充的统计方差。

例:select varp(prd_no) from sales

select函数和select函数的应用场景的问题分享结束啦,以上的文章解决了您的问题吗?欢迎您下次再来哦!

学java的软件叫什么软件,自学java需要什么软件java数组定义的几种方式 java数组的定义和使用