当前位置:   article > 正文

@ select 函数使用说明_@select使用

@select使用

select 函数说明

select函数使用场景

select能够使内核一旦发现进程指定一个或者多个I/O条件就绪时,就通知进程,也就是I/O复用功能。

select 函数定义

int select(int maxfdp, fd_set* readset, fd_set* writeset, fd_set* exceptset, struct timeval* timeout);

形参maxfdp含义

maxfdp是一个整数值,是指集合中所有文件描述符的范围,即所有文件描述符的最大值加1。

参数readset, writeset和exceptset

readset

readset是指向fd_set结构的指针,这个集合中应该包括文件描述符,要监视这些文件描述符的读变化的,即是否可以从这些文件中读取数据,也就是某个套接字准备好读,具体满足下面四个条件任何一个即可:
(1)该套接字接收缓冲区的数据字节数大于等于套接字接收缓冲区低水位标记值,对该套接字执行读操作不会阻塞并返回大于0的值,也就是读取数据的大小。可以通过SO_RCVLOWAT设置套接字接收缓冲区的低水位标记值,默认为1。
(2)该套接字读半部关闭(接收了FIN的套接字),对这样的套接字读操作不阻塞并返回0。
(3)该套接字是一个监听套接字且已完成连接数不为0,对这样的套接字执行accept操作不阻塞。
(4)该套接字上存在一个错误待处理,执行读操作不阻塞并返回-1,同时errno记录具体错误。

writeset

writeset是指向fd_set结构的指针,这个集合中应该包括文件描述符,要监视这些文件描述符的写变化的,即是否可以向这些文件中写入数据,也就是某个套接字准备好写,具体满足下面四个条件任何一个即可:
(1)该套接字发送缓冲区的可用空间字节数大于等于套接字发送缓冲区低水位标记值,并且该套接字已连接或者该套接字不需要连接(UDP)。如果这个套接字设置成非阻塞,写操作将不阻塞并返回一个正值,即写到发送缓冲区的数据长度,可以使用SO_SNDLOWAT套接字选项设置该套接字的发送低水位标记值,对TCP和UDP套接字默认是2048。
(2)该套接字的连接的写半部关闭,对这样的套接字执行写操作产生SIGPIPE信号。
(3)使用非阻塞式connect套接字已建立连接,或者connect已经以失败告终。
(4)该套接字上存在错误等待处理,执行写操作不阻塞并返回-1,同时errno记录具体错误。

exceptset

exceptset是指向fd_set结构的指针,这个集合中应该包括文件描述符,要监视这些文件描述符是否存在文件错误异常。如果一个套接字存在带外数据或者处于带外标记,那么它有异常条件待处理。

参数timeout

(1)当timeout指针为NULL,为永远等待;
(2) 当timeout设置为固定时间长度,就是等待一段固定时间;
(3)当timeout结构体值设置为0,表示检查描述符立刻返回。

返回值说明

在select函数处于等待过程中,线程会处于可被唤醒的休眠状态,会被进程等待期间所捕获的信号终端,并从信号处理函数返回,这是select函数返回值为-1,返回errno为EINTR错误,若超时时间到,没有检查到有效变化,则select函数返回0,如果检查到有效变化,则返回正值。具体如下所示:
(1)负值:select错误;
(2)正值:某些文件可读写或出错;
(3)0:等待超时,没有可读写或错误的文件。

本文内容由网友自发贡献,转载请注明出处:【wpsshop博客】
推荐阅读