alarm和ualarm
alarm和ualarm函数可以设置一定时间后向程序发送一个SIGALRM信号
alarm(5);//当前时间开始5秒后向发送一个信号
ualarm(500000,200000);//5秒之后发送第一个信号 间隔2秒发送一次
注意:当ualarm的两个参数设置超过1秒时会失效
demo
#include<stdio.h>
#include<signal.h>
#include<stdlib.h>
#include<sys/types.h>
static int jieffs = 0;
void alarm_on()
{
printf("the alram clock at %d\n",jieffs);
}
int main(int argc,char**argv)
{
//给信号绑定槽函数
signal(SIGALRM,alarm_on);
//从当前时间开始经过3秒后向当前进程发送一个SIGALRM信号
alarm(3);
while(1)
{
if(jieffs==15)
{
printf("the time is out\n");
//getpid()获得自己进程的pid
//kill 用来给进程发送信号 和 raise(int signum)函数效果一样
kill(getpid(),SIGINT);
}
sleep(1);
printf("%d\n",jieffs++);
}
}
定时器
//设置定时器
int setitimer(int which,struct itimerval*cur_value);
//获取定时器
int getitimer(int which,const struct itimerval*new_value,struct itimerval*old_value);
which:
ITIMER_REAL 以真实时间消逝递减 最常用
ITIMER_VIRTAL 进程当中时间
struct itimerval
{
struct timeval it_interval; //第一次触发经过的时间
struct timeval it_value; //每次促发的间隔
}
demo
#include <stdio.h>
#include <time.h>
#include <sys/time.h>
#include <stdlib.h>
#include <signal.h>
static int jieffs = 0;
void settimer(struct itimerval *timer)
{
timer->it_interval.tv_sec = 2;
timer->it_interval.tv_usec = 0;
timer->it_value.tv_sec = 4; //设置第一次发送信号的时间
timer->it_value.tv_usec = 0;
setitimer(ITIMER_REAL,timer,NULL);
}
void signal_handler()
{
printf("%d\n",jieffs++);
}
int main()
{
struct itimerval timer;
settimer(&timer);
signal(SIGALRM,signal_handler);
while(1)
{
sleep(1);
}
return 0;
}