/*
#include <unistd.h>
unsigned int alarm(unsigned int seconds);
功能:设置定时器。函数调用,开始倒计时,0的时候给当前的进程发送SIGALARM信号
参数:倒计时的时长。。单位:秒 如果参数为0,无效
返回值:倒计时剩余的时长
-之前没有定时器,返回0
-之前有定时器,返回之前的定时器剩余的时间
SIGALARM:默认终止当前的进程,每一个进程有且仅有唯一的定时器
函数不阻塞
*/
#include<stdio.h>
#include<unistd.h>
int main() {
int second = alarm(5);
printf("seconds = %d\n", second);
sleep(2);
second = alarm(2);
printf("seconds = %d\n", second);
while(1){
}
return 0;
}
后面新设的定时器会取代老的定时器
定时与进程的状态无关,无论进程是阻塞,挂起,就绪,运行定时器都是自己玩自己的
setitimer函数
/*
#include <sys/time.h>
int setitimer(int which, const struct itimerval *new_value, struct itimerval *old_value);
功能:设置定时器(闹钟)。可以替代alarm函数。精度微秒,可以实现周期性的定时。
参数:
-which:定时器以什么方式计时
-ITIMER_REAL:真实时间,时间到达,发送SIGALRM 常用
-ITIMER_VIRTUAL:用户时间,时间到达,发送SIGVTALRM
-ITIMER_PROF:一该进程在用户态和内核态下所消耗的时间来计算,时间到达,发送SIGPROF信号
-new_value:设置定时器的属性
struct itimerval {
struct timeval it_interval; 每个阶段的倒计时时长
struct timeval it_value; 延迟多长时间执行定时器
};
struct timeval {
time_t tv_sec; 秒数
suseconds_t tv_usec; 微秒
};
-old_value:记录上次定时的时间参数
返回值:成功0 失败-1
*/
#include <sys/time.h>
#include<stdio.h>
#include<unistd.h>
int main() {
struct itimerval new_value;
new_value.it_interval.tv_sec = 2;
new_value.it_interval.tv_usec = 0;
new_value.it_value.tv_sec = 3;
new_value.it_value.tv_usec = 0;
int ret = setitimer(ITIMER_REAL, &new_value, NULL);
printf("开始\n");
if(ret == -1) {
perror("ret");
return 0;
}
while(1) {
printf("1\n");
sleep(1);
}
return 0;
}
延迟三秒开始执行就会立马发送信号,然后每隔两秒发送一次