时钟编程: alarm和setitimer

本文介绍了Linux中的alarm和setitimer系统调用,它们用于进程定时。alarm以秒为单位设置计时器,当时间到时发送SIGALRM信号。setitimer提供更高精度的毫秒级计时,并支持间隔计时。两者通过信号机制实现异步处理,是Linux系统编程的重要组成部分。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

alarm
我们知道,sleep(n)函数可将进程挂起n秒,而其在实现上主要依靠alarm系统调用,sleep的工作原理有3部分组成:
1、为SIGALRM设置一个处理函数; —->SIGALRM为alarm计时n秒后发出的信号
2、调用alarm(n); —->设定一个计时器
3、调用pause. —->进程一直阻塞在pause,而pause函数只有在收到信号时才返回。

在进程中alarm设置计时器到n秒后激发信号。当设定的时间过去之后,内核发送SIGALRM到进程。如果在调用alarm时计时器已经被设置,则alarm返回剩余秒数。如果调用alarm(0)意味着关掉闹钟。
pause函数挂起进程直到收到信号,如果接收到的信号是将这个进程中止,则进程中止,pause无法返回。如果信号处理是忽略,则进程继续挂起,而pause不返回。如果信号处理是捕捉,则在调用信号处理函数之后返回-1。永远都是无法正常返回的,因为pause的目的是无限挂起。

由以上可以看出,linux的函数在设计时是多么的精妙。简简单单的一个sleep函数,拆解出来就是三部分,1、无限挂起2、计时器3、实现异步处理的信号。这三个部分都是十分模块化的部分,通过组合拼装可以形成其他功能,而其各自由于功能单一可以不断深化。模块化的思维体现地淋漓尽致。

setitimer
由于alarm的精度单位是秒,难以满足许多要求,于是引入了setitimer间隔计时器,以毫秒为单位,同时还支持间隔计时,不必循环。
result = setitimer(int which, const struct i

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值