一、select函数:
#include<sys/select.h>
#include<sys/time.h>
#include<sys/types.h>
#include<unistd.h>
int select(int nfds,fd_set *readfds,fd_set *writefds,fd_set *exceptfds,struct timeval *timeout);
参数说明:
nfds为fd_set集合中最大的文件描述符的值+1,fd_set是一个位数组,大小不超过1024(__FD_SETSIZE),它的每一位代表所对应的文件描述符是否需要被检查。
第二、三、四个参数是fd_set的位数组,表示需要关注读、写、错误事件的文件描述符的集合,既是传入参数也是传出参数,作为传出参数,会被内核修改,用于标示哪些位上的描述符上发生了关注的事件,所以每次使用select函数都需要重新初始化fd_set的集合。
第五个参数timeout为超时时间,该结构会被内核修改,其值为超时剩余的时间。
struct timeval{
long tv_sec;//秒数
long tv_usec;//微秒数
};
select函数的返回值:
0,timeout等待超时,没有可读写的文件描述符;
正,返回已经准备好的文件描述符的个数;
负,出错。
二、用select函数实现timer
在select函数中只设置timeout的值,其余参数皆不设置,即可利用select的timeout实现timer。
<span style="font-size:18px;">void seconds_sleep(unsigned seconds)
{
struct timeval tv;
time_t tt;
char* p=NULL;
tv.tv_sec=seconds;
tv.tv_usec=0;
int err;
do{
err=select(0,NULL,NULL,NULL,&tv);
time(&tt);
p=ctime(&tt);
printf("%s\n",p);
}while(err<0 && errno==EINTR);
}
int main(void)
{
unsigned int seconds=4;
time_t tt;
char* p=NULL;
time(&tt);
p=ctime(&tt);
printf("%s\n",p);
while(1)
seconds_sleep(seconds);
}
</span>