Linux 下可以使用 alarm 函数或 setitimer 函数设置一个定时器。alarm 的定时器是以 秒计时的,setitimer 的定时器可以精确到 微秒
alarm 可以在进程中设置一个定时器,当定时器指定的时间到时,它向进程发送SIGALRM信号。可以设置忽略或者不捕获此信号,如果采用默认方式其动作是终止调用该alarm函数的进程。
#include <unistd.h>
unsigned int alarm(unsigned int seconds);
seconds:指定秒数
成功:如果调用此alarm() 前,进程已经设置了闹钟时间,则返回上一个闹钟时间的剩余时间,否则返回0
失败:-1
示例:
#include <stdio.h>
#include <unistd.h>
#include <signal.h>
void sigHandFun(int signum)
{
printf("3秒时间到...\n");
}
int main(int argc, char const *argv[])
{
if (SIG_ERR == signal(SIGALRM, sigHandFun)) {
perror("signal");
return -1;
}
alarm(3);
printf("启动定时器,计时3秒...\n");
pause(); //SIGALRM 信号处理函数返回后,pause 立即返回
return 0;
}
#include <sys/time.h>
int setitimer(int which, const struct itimerval *new_value, struct itimerval *old_value);
which: 为定时器类型,setitimer支持3种类型的定时器:
new_value: 设置定时时长,和指定 多长时间后启动定时器
old_value:记录上一次的定时设置,不用 传NULL
成功返回 0,否则返回 -1
struct itimerval {
struct timeval it_interval; /* 定时时长 */
struct timeval it_value; /* 启动时间 */
};
struct timeval {
time_t tv_sec; /* 秒 */
suseconds_t tv_usec; /* 微秒 */
};
示例:
#include <stdio.h>
#include <signal.h>
#include <unistd.h>
#include <sys/time.h>
void sigHandFun(int signum)
{
static int n = 0;
n++;
if (2000 == n) {
printf("1秒时间到...\n");
}
}
int main(int argc, char const *argv[])
{
struct itimerval itv;
//信号处理
if (SIG_ERR == signal(SIGALRM, sigHandFun)) {
perror("signal");
return -1;
}
//设置定时时长: 0.5ms
itv.it_interval.tv_sec = 0;
itv.it_interval.tv_usec = 500;
//设置启动时间: 1秒后启动
itv.it_value.tv_sec = 1;
itv.it_value.tv_usec = 0;
//设置定时器
if (-1 == setitimer(ITIMER_REAL, &itv, NULL)) {
perror("setitimer");
return -1;
}
while(1);
return 0;
}