linux在用户态的定时器

1、alarm

unsigned int alarm(unsigned int seconds)
函数说明: alarm()用来设置信号SIGALRM在经过参数seconds指定的秒数后传送给目前的进程。

如果参数seconds为0,则之前设置的闹钟会被取消,并将剩下的时间返回。


void sigalrm_fn(int sig)
{
  printf("alarm!\n");
  alarm(2);
  return;
}

int main(void)
{
  signal(SIGALRM, sigalrm_fn);
  alarm(1);
  while(1) pause();
}


2、setitimer
int setitimer(int which, const struct itimerval *value, struct itimerval *ovalue));
which取值:
ITIMER_REAL : 以系统真实的时间来计算,它送出SIGALRM信号。
ITIMER_VIRTUAL : -以该进程在用户态下花费的时间来计算,它送出SIGVTALRM信号。
ITIMER_PROF : 以该进程在用户态下和内核态下所费的时间来计算,它送出SIGPROF信号。


struct itimerval {
  struct timeval it_interval;
  struct timeval it_value;
};
it_value是当前定时器剩下的时间。一旦it_value的值为0时,它会被设定为it_interval。
如果定时器到期,而且it_interval的值为0,则不会重新启动该定时器。
同样地,如果一个活动中的定时器的it_value被设为0,则定时器会停止运行,而且不会被重新启动。


如果ovalue的值不是NULL,则which类型的时间间隔定时器先前的值会被返回。


signal(SIGALRM, sigroutine);
signal(SIGVTALRM, sigroutine);

value.it_value.tv_sec = 1;
value.it_value.tv_usec = 0;
value.it_interval.tv_sec = 1;
value.it_interval.tv_usec = 0;
setitimer(ITIMER_REAL, &value, &ovalue); 

value2.it_value.tv_sec = 0;
value2.it_value.tv_usec = 500000;
value2.it_interval.tv_sec = 0;
value2.it_interval.tv_usec = 500000;
setitimer(ITIMER_VIRTUAL, &value2, &ovalue);


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值