linux在用户态的定时器

来源:互联网 发布:dota2比赛数据查询 编辑:程序博客网 时间:2024/05/16 06:56

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);


0 0
原创粉丝点击