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 }
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· DeepSeek “源神”启动!「GitHub 热点速览」
· 我与微信审核的“相爱相杀”看个人小程序副业
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· 如何使用 Uni-app 实现视频聊天(源码,支持安卓、iOS)
· C# 集成 DeepSeek 模型实现 AI 私有化(本地部署与 API 调用教程)