1、简单的alarm函数
我们为他设置了6秒的生命周期。
#include <stdio.h>
#include <unistd.h>
main(int argc, char const *argv[])
{
int ret = 0;
//放置一个闹钟,当6秒过后就会提示
ret = alarm(6);
printf("ret = %d\n",ret);
while(1){
printf("da wo a \n");
sleep(1);
}
return 0;
}
alarm()函数的主要功能是设置信号传送闹钟,即用来设置信号SIGALRM在经过参数seconds秒数后发送给目前的进程。如果未设置信号SIGALARM的处理函数,那么alarm()默认处理终止进程。
2、setitimer函数
setitimer(ITIMER_REAL,&myit,NULL);
主要是myit参数的设定
#include <stdio.h>
#include <sys/time.h>
#include <unistd.h>
main(int argc, char const *argv[])
{
/*
struct itimerval {
struct timeval it_interval; //间隔it_interval秒后再次响应
struct timeval it_value; //it_value秒后开始执行
};
struct timeval {
long tv_sec;//秒
long tv_usec; //微秒
};
*/
struct itimerval myit={{0,0},{3,0}};//3秒后开启
/*
开启定时器,ITIMER_REAL代表实时递减,时间到后会发出响应。
*/
setitimer(ITIMER_REAL,&myit,NULL);
while(1){
printf("ha\n");
sleep(1);
}
return 0;
}
当然这里面也没有信号signal()函数,最后也会结束。
然后让我们在里面加入信号signal函数,在catch_sig()函数里我们输出一个字符串。
C 库函数 void (*signal(int sig, void (*func)(int)))(int) 设置一个函数来处理信号,即带有 sig 参数的信号处理程序。
- sig -- 在信号处理程序中作为变量使用的信号码。下面是一些重要的标准信号常量:
宏 | 信号 |
---|---|
SIGABRT | (Signal Abort) 程序异常终止。 |
SIGFPE | (Signal Floating-Point Exception) 算术运算出错,如除数为 0 或溢出(不一定是浮点运算)。 |
SIGILL | (Signal Illegal Instruction) 非法函数映象,如非法指令,通常是由于代码中的某个变体或者尝试执行数据导致的。 |
SIGINT | (Signal Interrupt) 中断信号,如 ctrl-C,通常由用户生成。 |
SIGSEGV | (Signal Segmentation Violation) 非法访问存储器,如访问不存在的内存单元。 |
SIGTERM | (Signal Terminate) 发送给本程序的终止请求信号。 |
- func -- 一个指向函数的指针。它可以是一个由程序定义的函数,也可以是下面预定义函数之一:
-
SIG_DFL 默认的信号处理程序。 SIG_IGN 忽视信号。 - 两个特殊的参数,也可以自己写程序(信号处理函数的原型必须为void func(int))来代替。
#include <stdio.h>
#include <sys/time.h>
#include <unistd.h>
#include <signal.h>
//
void catch_sig(int num){
printf("cat %dsig\n",num);
}
main(int argc, char const *argv[])
{
signal(SIGALRM,catch_sig);
//第一次等待五秒,之后每隔三秒发送一次信号。
struct itimerval myit = {{3,0},{5,0}};
setitimer(ITIMER_REAL,&myit,NULL);
while(1){
printf("ha\n");
sleep(1);
}
return 0;
}
让我们再来看看结果
最后我们自己优化一下定时函数,让他可以输出剩余时间。
#include <stdio.h>
#include <sys/time.h>
#include <unistd.h>
#include <signal.h>
/*
参数:seconds:设置起始时间
printf输出当下剩余的时间
*/
unsigned int myalarm(unsigned int seconds){
//{周期性定时秒:微秒},{下一次时间秒:微秒}
struct itimerval oldit,myit = {{0,0},{0,0}};
myit.it_value.tv_sec = seconds;
setitimer(ITIMER_REAL,&myit,&oldit);
printf("tv_sec = %ld,tv_mirsrc%ld\n",oldit.it_value.tv_sec,oldit.it_value.tv_usec);
return oldit.it_value.tv_sec;
}
main(int argc, char const *argv[])
{
int ret = 0;
ret = myalarm(4);
printf("ret = %d\n",ret);
sleep(1);
//返回剩余的时间
ret = myalarm(4);
printf("ret = %d\n",ret);
while(1){
printf("lai da wo\n");
sleep(1);
}
/* code */
return 0;
}
代码跑完。当我们睡眠1秒后我们剩余的时间还有接近3秒,最后输出了三次lai da wo。