1.alarm函数
a.原型:unsigned int alarm(unsigned int seconds);
b.返回值:返回 0 或上一个 alarm 剩余的秒数,无失败。
c.作用:设置定时器(闹钟)。在指定 seconds 后,内核会给当前进程发送 14)SIGALRM 信号。进程收到该信号,默认动作终止。
2.signal 函数:
原型:sighandler_t signal(int signum, sighandler_t handler);
作用:注册一个信号捕捉函数:
3.setitimer函数
原型:int setitimer(int which, const struct itimerval *new_value, struct itimerval *old_value);
a.参数:
which:指定定时方式
常用:自然定时: ITIMER_REAL → 14)SIGLARM-------------计算自然时间
struct itimerval的结构:
struct itimerval{
struct timeval{
it_interval.tv_sec;
it_interval.tv_usec;
}it_interval;
struct timeval{
it_value.tv_sec;
it_value.tv_usec;
}it_value;
}it,oldit;
it_interval:用来设定两次定时任务之间间隔的时间。
it_value:定时的时长
b.返回值:成功: 0;失败: -1,设置 errno
c.作用:设置定时器(闹钟)。 可代替 alarm 函数。精度微秒 us,可以实现周期定时。
代码:setitimer1.c
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/time.h>
#include <signal.h>
void myfunc(int signo)
{
printf("hello world\n");
}
int main()
{
struct itimerval it,oldit;
//捕捉到SIGALRM信号后,执行myfunc函数,signal函数的作用只是注册myfunc函数,
//真正捕捉信号的是内核,调用myfunc函数的也是内核
//信号捕捉函数是一个典型的回调函数
signal(SIGALRM,myfunc); //注册SIGALRM信号的捕捉处理函数
//sighandler_t tml = signal(SIGALRM,myfunc);
it.it_value.tv_sec = 5;//定时5秒
it.it_value.tv_usec = 0;
it.it_interval.tv_sec = 3;//第一个闹钟和第二个闹钟的时间间隔是3秒
it.it_interval.tv_usec = 0;
//5秒之后,发送SIGALRM信号
if(setitimer(ITIMER_REAL,&it,&oldit)==-1){
perror("setitimer error");
return -1;
}
while(1);
return 0;
}
//执行结果:5秒之后打印第一个hello world,之后都是3秒打印一个hello world
结果:5秒之后打印第一个hello world,之后都是3秒打印一个hello world