前言:
这类函数主要类似于闹钟一样,可以定时的去发送信号,一般用来周期性的操作,就是定时器一样。(注:一般跟信号捕捉函数一起使用)
alarm函数
传送门,请点击
举个简单例子:
# include <stdio.h>
# include <stdlib.h>
# include <unistd.h>
# include <sys/types.h>
# include <signal.h>
int main(void)
{
alarm(5);
while(1){
printf("I am happy\n");
sleep(1);
}
return 0;
}
setitimer函数
这个函数跟alarm函数更精确时间,可以精确到微秒,setitimer()有两个功能,一是指定一段时间后,才执行某个function,(此时,跟alarm函数功能几乎一样)二是每间格一段时间就执行某个function
返回值:成功返回0;失败返回-1,并把错误号写到errno变量中
//头文件
#include <sys/time.h>
//函数原型
int setitimer(int which, const struct itimerval *new_value,
struct itimerval *old_value);
which参数表示类型,可选的值有:
ITIMER_REAL:以系统真实的时间来计算,它送出SIGALRM信号。
ITIMER_VIRTUAL:以该进程在用户态下花费的时间来计算,它送出SIGVTALRM信号。
ITIMER_PROF:以该进程在用户态下和内核态下所费的时间来计算,它送出SIGPROF信号。
new_value和old_value均为itimerval结构体,而结构体里面依然是两个结构体封装
struct itimerval {
struct timeval it_interval; /* next value /
struct timeval it_value; / current value */
};
struct timeval {
time_t tv_sec; /* seconds /
suseconds_t tv_usec; / microseconds */
};
timeval包含tv_sec和tv_usec两部分,其中tv_se为秒,tv_usec为微秒(即0.0000001秒)
其中的new_value参数用来对计时器进行设置,it_interval为计时间隔,it_value为延时时长,
old_value参数,一般情况下用不上,我们就可以设置为NULL,它就是用来存储上一次setitimer调用时设置的new_value值。
注意:由上面setitimer函数可知,完全可以用来替代alarm这个不精准定时器
举个例子:
# include <stdio.h>
# include <stdlib.h>
# include <unistd.h>
# include <sys/types.h>
# include <signal.h>
# include <sys/time.h>
void catch_sig(int sig){
printf("I catch the %d siganl\n",sig);
return ;
}
int main(void)
{
//第一个表示周期,第二个表示第一次发送信号的时间
//形成了第一次五秒发送SIGALRM信号,然后每三秒发送信号
struct itimerval st={{3,0},{5,0}};
printf("begin...\n");
setitimer(ITIMER_REAL,&st,NULL);
signal(SIGALRM,catch_sig);
while(1);
return 0;
}