文章目录
- alarm() 函数实现定时功能
- setitimer() 函数实现定时功能
alarm() 函数实现定时功能
alarm()函数的签名如下:
#include <unistd.h>
unsigned int alarm(unsigned int seconds);
参数1 是你想定时的秒数。
返回值是在你调用这个函数的时刻,上一次的 alarm() 所剩余的秒数。例如,你上一次调用了 alarm(10),7秒钟以后你再次调用了alarm(6),那么在 alarm(6) 时返回的值就是 3 。
alarm() 的定时是一次性的,若想实现循环定时功能,则需要手动在本次定时结束时再次启动 alarm() 定时。
[如代码实现中,第一次设定定时器后,经过3s后才调用sig_alarm_handler函数,因为是一次性的,所以在sig_alarm_handler函数中, int remaing = alarm(2);继续使用alarm函数]
alarm() 在定时到时后会发出一个 SIGALRM 信号,所以还需要我们拦截这一信号才能接收到定时回调结果。
代码实现
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <unistd.h>
#include <signal.h>
#include <time.h>static int counter;void sig_alarm_handler(int);time_t current_time;
struct tm *time_info;
char timeString[64]; // 用于存储格式化后的时间void output_time()
{// 获取当前时间time(¤t_time);// 将time_t类型的时间转换为tm结构time_info = localtime(¤t_time);// 格式化时间输出为年-月-日 时:分:秒strftime(timeString, sizeof(timeString), "%Y-%m-%d %H:%M:%S", time_info);printf("当前时间: %s\n", timeString);
}int main()
{printf("pid: %d\n", getpid());// sighandler_t *pre = signal(SIGALARM, sig_alarm_handler);//拦截定时器信号。__sighandler_t *pre = signal(SIGALRM, sig_alarm_handler);printf("signal() return ret address:%p,my sig_alm_handler:%p\n", pre, sig_alarm_handler);//设定定时器。int remaing = alarm(3);output_time();printf("alarm remaing:%d\n", remaing); // remaing 应该是0才对。counter = 0;while (1){// usleep(500);}//主动关闭定时器。alarm(0);output_time();return 0;
}void sig_alarm_handler(int sig_num)
{printf("%s,signal number:%d,couter:%d\n", __FUNCTION__, sig_num, counter);if (sig_num == SIGALRM){counter++;int remaing = alarm(2);printf("re-alarm remaing:%d\n", remaing);output_time();}
}
setitimer() 函数实现定时功能
补充。。