select():此函数的作用是用来检测文件描述符是否已准备就绪。
参数一:numfds - 该参数的值为需要监视的文件描述最大数量加一。
参数二:readfds - 由select函数监视的读文件描述符集。
参数三:writefds - 由select函数监视的写文件描述符集。
参数四:exeptfds - 由select函数监视的异常处理文件描述符集。
参数五:timeout - 设定的检测超时值。为NULL时表示永远等待,直到有文件描述符
就绪。为具体值时如规定时间内没有检测到有描述符准备就绪,就立即返回。
返回值:0 - 超时。
-1 - 出错。
>0 - 成功且表示准被好的文件描述符。
-----------------------------------------------------------------------------------------------------------
用法:
fd_set file_sets;
fd_set tmp_sets;
int fd;
fd = xx_function(); //--xx_function()的返回值是一个文件描述符--//
//---初始化文件描述符集file_sets---//
FD_ZERO(file_sets);
FD_SET(fd, file_sets);
while(1)
{
tmp_sets = file_sets; //--避免重复初始化file_sets--//
/*
select操作后的结果是如果tmp_sets中的文件描述准备就绪则不从tmp_sets中
删除,否则则从tmp_sets中删除。这也是为什么会有tmp_sets = file_sets的原
因。
*/
select(MAX_FD_SETS + 1, &tmp_sets, NULL, NULL,NULL);
for (int fd = 0; fd < MAX_FD_SETS; ++fd)
{
//---对准备就绪的描述符做相关处理---//
if (FD_ISSET(fd, tmp_sets))
{
xx_function(fd);//--处理函数--//
}
}
}