`
fp_moon
  • 浏览: 977695 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

select函数总结

 
阅读更多

select函数总结

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

版权所有,转载请注明出处。http://www.vimer.cn

分享到:
评论

相关推荐

    linux socket的select函数例子

    在Linux系统中,`select`函数是用于网络编程中处理多路I/O复用的关键机制之一,它允许程序同时监控多个文件描述符(如网络套接字)的状态变化,而无需实际读取或写入数据。`select`函数在处理高并发连接请求时尤其...

    润乾报表函数总结

    润乾报表函数总结是对润乾报表教程中常用函数的总结,涵盖多种函数,包括 to 函数、select 函数、int 函数、map 函数等。这些函数在报表中具有重要作用,可以帮助用户快速生成报表、处理数据和实现复杂的数据分析。 ...

    select函数详细分析

    ### select函数详细分析 #### 一、概述 `select`函数是操作系统提供的一个重要系统调用,主要用于让程序能够同时监控多个文件描述符(file descriptor)的状态变化。这使得程序可以在多个网络连接或输入输出流之间...

    Linux中select函数使用详解.zip_Linux中select函数使用详解

    总结来说,`select`函数是Linux下多路IO编程的基础,虽然在处理大量并发时效率较低,但在理解和学习多路复用I/O时仍然有着重要的地位。通过合理使用,`select`可以在有限的资源下有效地处理多个I/O事件,是初学者...

    linux c语言 select函数的用法

    ### Linux C语言中的select函数详解 #### 一、select函数简介 `select`函数是Linux系统下用于实现I/O多路复用的核心函数之一,在C语言编程中被广泛使用。它能够有效地监控多个文件描述符(File Descriptor, FD),...

    SQL常用函数总结

    SQL常用函数总结 SQL作为一门标准的数据库语言,在实际应用中有很多常用的函数和语句,这些函数和语句可以帮助我们更方便地操作和处理数据。在本文中,我们将总结一些常用的SQL函数和语句,并对其进行详细的解释。 ...

    C--网络编程SELECT函数用法详解

    ### C++网络编程中SELECT函数详解 #### 一、引言 在C++网络编程领域,`select`函数因其灵活性和高效性而被广泛应用于多种场景。尤其在处理多个网络连接的同时读写操作时,`select`能显著提高程序的性能。本文将深入...

    oracle函数总结

    "Oracle函数总结" Oracle数据库提供了多种函数来处理不同的数据类型,包括字符函数、数值函数、日期函数、转换函数、通用函数等。下面将对这些函数进行详细的介绍。 字符函数 字符函数用于处理字符串数据,常用的...

    mssql日期函数总结

    mssql 日期函数总结 MS SQL Server 提供了丰富的日期函数,开发中经常会用到。下面总结了常用的日期函数: 1. 获取当前时间 `GETDATE()` 函数用于获取当前的日期和时间,精确到毫秒。 示例:`SELECT GETDATE()` ...

    Pytorch中index_select() 函数的实现理解

    总结来说,index_select()函数在深度学习模型中常用来提取特征或者进行数据选择。利用该函数可以方便地对数据进行切片操作,从而提取出需要的特定维度数据,是Pytorch中处理张量操作的一个重要函数。对于初学者来说...

    数据库常用聚合函数总结

    根据给定的信息,本文将对数据库中常用的聚合函数进行详细解释和总结,这些函数在处理大量数据时极为有用,能够帮助我们快速获取所需的关键信息。 ### 1. AVG(平均值) AVG 函数用于计算指定列的平均值。例如,在...

    lwip数据接收发送过程函数

    #### 六、总结 通过上述解析可以看出,LWIP数据收发的关键在于正确配置和使用上述提到的各种函数。从初始化到监听连接请求,再到数据接收与发送,每个环节都至关重要。理解这些函数的具体作用及其之间的关联,对于...

    oracle自定义函数总结

    #### 五、总结 本文详细介绍了Oracle自定义函数的定义方法、常见用途及一些高级特性。通过这些自定义函数,我们可以更好地管理和优化数据库中的数据处理逻辑。掌握这些技术对于提高开发效率、减少重复工作量具有...

    select详解

    总结来说,`select`函数是Linux网络编程中处理并发I/O的重要工具,尤其适用于需要监控多个文件描述符的场景。通过`udp_thread.c`和`udp_select.c`的代码示例,我们可以学习如何结合`select`与UDP协议实现高效的并发...

    基本select 语句总结

    基本 SELECT 语句总结 本文档将详细介绍基本 SELECT 语句的使用,包括基本查询语法、过滤和排序、单行函数等知识点。 基本查询语法 SELECT 语句是 SQL 中最基本的语句,用于从数据库中检索数据。基本查询语法的...

    ORACLE常用函数总结

    ### ORACLE常用函数总结 在Oracle数据库中,各种内置函数为数据处理提供了强大的支持。本文将根据提供的部分内容,详细介绍部分常用的Oracle函数,并解释其功能及用法。 #### 1. ASCII ASCII函数用于返回给定字符...

    select在socket中的使用示例

    总结起来,`select`在socket编程中的使用主要是为了提高程序的并发性能,通过监控多个套接字的状态,使得程序能够及时响应多个客户端的请求,而提供的代码和实验结果文件则为我们提供了实践和理解这一概念的实例。

    Greenplum窗口函数总结1

    ### Greenplum窗口函数总结 #### 一、创建与准备数据 ##### 1.1 创建测试的表 `test13` 在Greenplum数据库中,为了进行窗口函数的演示和练习,我们首先需要创建一个测试表`test13`。假设表结构包括`id`(标识符)...

    Oracle基本函数总结

    ### Oracle基本函数总结 在Oracle数据库中,使用各种内置函数可以极大地提高数据处理效率与准确性。本文将对一些常用的基本函数进行详细介绍,并提供相应的示例,帮助读者更好地理解和掌握这些函数。 #### 一、...

Global site tag (gtag.js) - Google Analytics