2.21 alarm函数
#include <unistd.h>
unsigned int alarm(unsigned int seconds);
-
功能:设置定时器(闹钟)。函数调用,开始倒计时,当倒计时为0的时候,
函数会给当前的进程发送一个信号:SIGALARM -
参数:
seconds: 倒计时的时长,单位:秒。如果参数为0,定时器无效(不进行倒计时,不发信号)。取消一个定时器,通过alarm(0)。 -
返回值:
- 之前没有定时器,返回0
- 之前有定时器,返回之前的定时器剩余的时间 -
SIGALARM :默认终止当前的进程,每一个进程都有且只有唯一的一个定时器。
alarm(10); -> 返回0,之前没有定时器
过了1秒
alarm(5); -> 返回9,返回之前的定时器剩余的时间alarm(100) -> 该函数是不阻塞的,可以继续执行其他的代码
#include <stdio.h>
#include <unistd.h>int main() {int seconds = alarm(5);printf("seconds = %d\n", seconds); // 0sleep(2);seconds = alarm(2); // 不阻塞printf("seconds = %d\n", seconds); // 3//while循环的目的是,过了两秒后,倒计时为0时,函数会给当前的进程发送一个信号:SIGALARM,默认终止当前的进程。while(1) {}return 0;
}
最终效果:
1秒电脑能数多少个数?
// 1秒钟电脑能数多少个数?
#include <stdio.h>
#include <unistd.h>/*实际的时间 = 内核时间(系统调用) + 用户时间(普通代码执行) + 消耗的时间(IO操作)进行文件IO操作的时候比较浪费时间定时器,与进程的状态无关(自然定时法)。无论进程处于什么状态,alarm都会计时。
*/int main() { alarm(1);int i = 0;while(1) {printf("%i\n", i++);}return 0;
}
2.22setitimer定时器函数
#include <sys/time.h>
#include <stdio.h>
#include <stdlib.h>// 过3秒以后,每隔2秒钟定时一次
int main() {struct itimerval new_value;// 设置间隔的时间new_value.it_interval.tv_sec = 2;new_value.it_interval.tv_usec = 0;// 设置延迟的时间,3秒之后开始第一次定时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("setitimer");exit(0);}getchar();return 0;
}