(笔记)linux下用select函数的超时实现timer(时间定时器s)

时间:2022-07-13 20:36:50

一、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>