Linux---select()实现高精度延时与alarm()定时器

一、select函数

int select(int nfds, fd_set *readfds, fd_set *writefds, 
fd_set *exceptfds, struct timeval *timeout);

设置timeout的值,而将其他参数都置为NULL,当内部时间耗尽后select便会退出。

二、select延时程序实例

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <errno.h>

void seconds_sleep(unsigned seconds){
  struct timeval tv;
  tv.tv_sec=seconds;
  tv.tv_usec=0;

  int err;
  system("date");
  do{
  err=select(0,NULL,NULL,NULL,&tv);
  }while(err<0 && errno==EINTR);
  system("date");
}


void main()
{
  seconds_sleep(5);
  seconds_sleep(3);
}

三、select实例测试

book@Joy:~/code/test$ ./select_app 
Mon Oct 18 11:10:36 EDT 2021
Mon Oct 18 11:10:41 EDT 2021
Mon Oct 18 11:10:41 EDT 2021
Mon Oct 18 11:10:44 EDT 2021

从系统函数date打印的时间戳来看,select函数延时是准确的,两次打印的时间差分别是5s和3s,与预期一致。实际上设置tv.tv_usec还可以更精确,一般精确不到us,基本上精确到10ms左右,也与内核调度有关。

四、alarm函数

SYNOPSIS
       #include <unistd.h>

       unsigned int alarm(unsigned int seconds);

DESCRIPTION
       alarm() arranges for a SIGALRM signal to be delivered to the calling process in seconds seconds.

       If seconds is zero, any pending alarm is canceled.

       In any event any previously set alarm() is canceled.

alarm()函数功能:设置信号传送闹钟,即用来设置信号SIGALRM在经过参数seconds秒数后发送给目前的进程。如果未设置信号SIGALARM的处理函数,那么alarm()默认处理终止进程。

函数返回值:如果在seconds秒内再次调用了alarm函数设置了新的闹钟,则后面定时器的设置将覆盖前面的设置,即之前设置的秒数被新的闹钟时间取代;当参数seconds为0时,之前设置的定时器闹钟将被取消,并将剩下的时间返回。

五、alarm定时器实例

#include <stdio.h>
#include <unistd.h>
#include <signal.h>

void sigalrm_fn(int sig)
{
	system("date");
    printf("%s %d\n", __FUNCTION__, __LINE__);
}

int main(void)
{
    signal(SIGALRM, sigalrm_fn);
    system("date");
    alarm(3);
    while(1)
    {
        sleep(1);
    }
    return 0;
}

六、alarm实例测试

Joy@ubuntu:~/temp$ ./alarm_test 
Tue Oct 19 11:14:40 CST 2021
Tue Oct 19 11:14:43 CST 2021
sigalrm_fn 8

从系统函数date打印的时间戳可以看到2次的时间差为3s,与alarm设置的3s定时器预期一致,signal函数注册的SIGALRM信号处理函数在3s后得到执行。

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值