linux alarm函数 、setitimer函数、signal函数

alarm定时器:

复制代码
 1 /*
 2     #include <unistd.h>
 3     unsigned int alarm(unsigned int seconds);
 4         - 功能: 设置定时器(闹钟),函数调用开始倒计时,当倒计时为0的时候
 5                 函数会给当前的进程发送一个信号: SIGALARM
 6         - 参数: 
 7             seconds:倒计时的时长,单位:秒。如果参数为0,定时器无效(不进行倒计时,不发送信号)
 8                     取消一个定时器,调用alarm(0).
 9         - 返回值: 倒计时剩余的时间
10     - SIGALARM: 默认终止当前的进程,每一个进程都有且只有唯一的一个定时器
11         alarm(10); -> 返回0
12         过了1秒
13         alarm(5);->  返回9
14     alarm(100) -> 该函数是不阻塞的
15 */
16 #include <stdio.h>
17 #include <unistd.h>
18 int main()
19 {
20     int seconds = alarm(5);
21     printf("seconds = %d\n",seconds);//0
22     sleep(2);
23     seconds = alarm(2);//alarm不阻塞 时间到才终止
24     printf("seconds = %d\n",seconds);//3
25     while(1){}//死循环 到期终止
26     return 0;
27 }
复制代码

计算机1秒可以输出多少数字:

复制代码
 1 //1 秒内电脑能数多少数
 2 #include <stdio.h>
 3 #include <unistd.h>
 4 /*
 5     实际运行的时间 = 内核时间(系统调用) + 用户时间(代码执行时间) + I/O等其他消耗的时间(还有内核和用户之间切换)
 6     进行文件I/O操作的时候比较浪费时间
 7     定时器,与进程的状态无关(自然定时法),无论进程处于什么状态,alarm都会计时.
 8 */
 9 int main()
10 {
11     alarm(1);
12     int i = 0;
13     while(1)
14     {
15         printf("%i\n",i++);
16     }
17     return 0;
18 }
复制代码

执行可执行程序 >> 文件 :将结果填充到 指定文件中    案例:将alarm1的结果填充到 a.txt文件中

文件中的数字要远多于终端的数字,且终端结果运行不止程序中的一秒,是因为各类消耗时间导致的。

实际计算机输出的数字相较  a.txt  文件中也还要多,因为与文件交互也消耗了时间。

Setitimer函数:

复制代码
 1 /* 
 2     man 2 setitimer
 3     #include <sys/time.h>
 4     int setitimer(int which, const struct itimerval* new_value, struct itimerval* old_value);
 5         - 功能: 设置定时器(闹钟),可以替代alarm函数,精度 微秒μs, 可以实现**周期性定时***.
 6                 例: 每隔一小时,响应一次  8:00->9:00->10:00
 7         - 参数:
 8             - which: 定时器以什么时间计时
 9                 ITIMER_REAL: 真实时间,时间到达,发送 SIGALARM 常用
10                 ITIMER_VIRTUAL:用户时间,时间到达,发送SIGVTALRM
11                 ITIMER_PROF:以该进程在用户态和内核态下所消耗的时间来计算,时间到达, 发送SIGPROF    
12             - new_value: 设置定时器的属性,
13             struct itimerval{               //定时器的结构体
14                 struct timeval it_interval; //间隔的时间
15                 struct timeval it_value;    //延迟多长时间执行定时器
16             };
17             struct timerval{                //时间的结构体
18                 time_t tv_sec;              //秒数
19                 suseconds_t tv_usec;        //微秒 μs
20             };
21             过10s后,每隔2秒定时一次
22             - old_value: 记录上一次定时的参数,一般不使用,设为 NULL.
23         - 返回值:
24             成功: 0
25             失败: -1 并设置错误号
26 */
27 #include<stdio.h>
28 #include <sys/time.h>
29 #include <stdlib.h>
30 //过3s以后,每隔2秒定时一次
31 int main()
32 {
33     struct itimerval new_value;//栈内存中 值随机分配
34     //设置间隔额时间
35     new_value.it_interval.tv_sec = 2;//
36     new_value.it_interval.tv_usec = 0;//微秒
37     //设置延迟时间,3秒之后开始第一次定时
38     new_value.it_value.tv_sec = 3;//
39     new_value.it_value.tv_usec = 0;//微秒
40     int ret = setitimer(ITIMER_REAL,&new_value,NULL);//非阻塞的
41     printf("定时器开始了...\n");
42     if(ret == -1)
43     {
44         perror("setitimer");
45         exit(0);
46     }
47     getchar();//获取键盘录入
48     return 0;
49     //未有信号捕捉内容,内容不完善.
50 }
复制代码

信号捕捉(signal信号):输出捕捉信号

复制代码
 1 /*
 2     man 2 signal   信号捕捉 信号处理
 3     #include <signal.h>
 4     typedef void (*sighandler_t)(int);
 5     __sighandler_t signal(int signum, sighandler_t handler);
 6         - 功能: 设置某个信号的捕捉行为
 7         - 参数:
 8             - signum: 要捕捉的信号
 9             - handler: 捕捉到信号要如何处理
10                 - SIG_IGN: 忽略信号
11                 - SIG_DFL: 使用信号默认的行为
12                 - 回调函数: 这个函数是内核调用,程序员只负责写,捕捉到信号后,如何去处理信号
13                 回调函数:
14                     - 需要程序员实现,提前准备好的,函数的类型根据实际需求,看函数指针的定义
15                     - 不是程序员调用,而是当信号产生,由内核调用
16                     - 函数指针是实现回调的手段,函数实现之后,将函数名(函数地址)放到函数指针的位置就可以了
17         - 返回值:
18             成功: 返回上一次注册的信号处理函数的地址,第一次调用返回NULL
19             失败: SIG_ERR.设置错误号
20 
21     The signals SIGKILL and SIGSTOP  cannot be caught or ignored. 不能被捕捉或忽略
22 */
23 #include <stdio.h>
24 #include <sys/time.h>
25 #include <stdlib.h>
26 #include <signal.h>
27 void myAlarm(int num){
28     printf("捕捉到了信号的编号:%d\n", num);
29     printf("xxxxxxxx\n");
30 }
31 //过3s以后,每隔2秒定时一次
32 int main()
33 {
34     //注册信号捕捉
35     //signal(SIGALRM, SIG_IGN);//忽略
36     //signal(SIGALRM, SIG_DFL);//终止
37     //void (*sighandler_t)(int);//函数指针 返回值void 参数 int 表示捕捉到信号的值
38     __sighandler_t ret1 = signal(SIGALRM, myAlarm);
39     if(ret1 == SIG_ERR)
40     {
41         perror("signal");
42         exit(0);
43     }
44     struct itimerval new_value;//栈内存中 变量值随机分配
45     //设置间隔额时间
46     new_value.it_interval.tv_sec = 2;//
47     new_value.it_interval.tv_usec = 0;//微秒
48     //设置延迟时间,3秒之后开始第一次定时
49     new_value.it_value.tv_sec = 3;//
50     new_value.it_value.tv_usec = 0;//微秒
51     int ret = setitimer(ITIMER_REAL,&new_value,NULL);//非阻塞的
52     printf("定时器开始了...\n");
53     if(ret == -1)
54     {
55         perror("setitimer");
56         exit(0);
57     }
58     getchar();//获取键盘录入
59     return 0;
60 }
复制代码

 

posted on   廿陆  阅读(295)  评论(0编辑  收藏  举报

相关博文:
阅读排行:
· DeepSeek “源神”启动!「GitHub 热点速览」
· 我与微信审核的“相爱相杀”看个人小程序副业
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· 如何使用 Uni-app 实现视频聊天(源码,支持安卓、iOS)
· C# 集成 DeepSeek 模型实现 AI 私有化(本地部署与 API 调用教程)
点击右上角即可分享
微信分享提示