linux C之setitimer函数简单使用

在说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.

欢迎补充指正.

你可能感兴趣的:(Linux,C/C++,Linux编程)