在说setitimer函数之前, 先来说说alarm函数:
unsigned int alarm(unsigned int seconds);
alarm函数会建立一个定时器, 在seconds秒后, 给当前进程发送SIGALRM信号.
setitimer也用来创建定时器, 不过它比alarm功能多, 最显著的区别就是它可以指定到微秒, 而且可以循环发送.
setitimer manpage: man 2 setitimer
想象一个生活中的场景, 现在想每天早上7点起床, 但是太贪睡, 7点后还不想起, 就每隔10分钟再提醒自己.
这种类似的场景就可以用setitimer函数来实现.
写了一个小的demo来体会下用法:
// setitimer.c
#include
#include
#include
#include
#include
// 注册信号处理函数, 打印当前时间戳,信号编号及对应的说明
void sigHandler(int sig) {
printf("[%d] caught signal: #%d: %s\n", time(NULL), sig, strsignal(sig));
}
int main(int argc, const char *argv[]) {
// 打印开始时间戳
printf("[%d] start\n", time(NULL));
// 注册SIGALRM信号处理函数, setitimer函数会不停地发SIGALRM信号
signal(SIGALRM, sigHandler);
struct itimerval it, oldit;
// 第3秒时发一次SIGALRM信号
it.it_interval.tv_sec = 3;
it.it_interval.tv_usec = 0;
// 以后每隔1秒发一次SIGALRM信号
it.it_value.tv_sec = 1;
it.it_value.tv_usec = 0;
setitimer(ITIMER_REAL, &it, NULL);
while(1);
return 0;
}
编译, 运行, 结果类似这样:
[root@mycentos signal]# ./setitimer.out
[1545494598] start
[1545494599] caught signal: #14: Alarm clock
[1545494602] caught signal: #14: Alarm clock
[1545494605] caught signal: #14: Alarm clock
^C
[root@mycentos signal]#
可以看到效果是:
第3秒时发一次SIGALRM信号, 以后每隔1秒发一次SIGALRM信号
这里只说下setitimer基本的用法, 更多高级用法请参见相应的manpage.
欢迎补充指正.