setitimer()函数
定时器时间函数
struct itimerval: struct itimerval *new_value,其定义如下: struct itimerval { struct timeval it_interval; /*next value*/ struct timeval it_value; /*current value*/ }; struct timeval { long tv_sec; /*seconds*/ lonng tv_usec /*microseconds*/ };
和alarm函数类是,用于定时操作。
函数原型为
int setitimer(int which, const struct itimerval *new_value, struct itimerval *old_value);
其中which参数表示类型,可选的值有:
- ITIMER_REAL:以系统真实的时间来计算,它送出SIGALRM信号。
- ITIMER_VIRTUAL:以该进程在用户态下花费的时间来计算,它送出SIGVTALRM信号。
- ITIMER_PROF:以该进程在用户态下和内核态下所费的时间来计算,它送出SIGPROF信号。
old_value的值一般为NULL。
settimer工作机制是,先对it_value倒计时,当it_value为零时触发信号,然后重置为it_interval,继续对it_value倒计时,一直这样循环下去。
/*** setitimer.c ***/ #include<stdio.h> #include<stdlib.h> #include<sys/time.h> #include<signal.h> void myfunc(int signo) { puts("hello world."); } int main() { struct itimerval it,oldit; signal(SIGALRM,myfunc); it.it_value.tv_sec = 5; it.it_value.tv_usec = 0; it.it_interval.tv_sec = 3; it.it_interval.tv_usec = 0; if(setitimer(ITIMER_REAL,&it,&oldit) == -1) { perror("setitimer error "); exit(1); } while(1); return 0; }
运行结果:
root@ubuntu:/mnt/hgfs/ShareWindows/shiyanlou/C/Flappy_Bird# gcc setitimer.c -o setitimer
root@ubuntu:/mnt/hgfs/ShareWindows/shiyanlou/C/Flappy_Bird# ./setitimer
hello world.
hello world.
hello world.
hello world.
hello world.
hello world.
^C
执行之后,间隔5秒之后打印hello,world。然后在间隔三秒打印,后续的都是间隔3秒。
这里我们知道:new_value.it_interval是用来控制第一次定时时长,new_value.it_value是用来定时后续定时的时长,并且是程序不死就连续定时(即,信号被我们捕捉,不执行默认动作了)。
如果想知道定时器还有多久定到时间,再次调用setitimer函数,取出old_value可查看。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)