Understanding Unix/Linux Programming-时钟编程:Alarms

  • sleep:添加时延
    • sleep(n)将当前的进程挂起n秒或者在此期间被一个不能忽略的信号的到达所唤醒
  • sleep是如何工作的
    • 系统中的每个进程都有一个私有的闹钟(alarm clock)。这个闹钟很像一个计时器,可以设置在一定秒数后闹铃。时间一到,时钟就发送一个信号SIGALRM到进程。除非SIGALRM设置了处理函数,否则信号将杀死这个进程。sleep函数由以下三个步骤组成:
      1. 为SIGALRM设置一个处理函数
      2. 调用alarm(num_seconds)
      3. 调用pause。
    • 系统调用pause挂起进程直到信号到达。任何信号都可以唤醒进程,而非仅仅等待SIGALRM。将以上想法总结为以下代码:
  •  

     1 #include <stdio.h>
     2 #include <stdlib.h>
     3 #include <signal.h>
     4 
     5 void wakeup(int signum);
     6 
     7 int main()
     8 {
     9     printf("About to sleep for 4 seconds.\n" );
    10     signal(SIGALRM , wakeup );
    11     alarm(4);
    12     pause();
    13     printf("Morning so soon ? \n" );
    14 }
    15 
    16 void wakeup(int signum)
    17 {
    18     printf("Alarm received from kernel.\n");
    19 }
    • sleep的细节:
      • 返回值:
        • -1:出错
        • old : 计时器剩余的时间
      • alarm设置本进程的计时器到seconds秒后激发信号SIGALRM。当设定的时间过去之后,内核发送SIGALRM到这个进程。如果计时器已经被设置,alarm返回剩余的秒数。调用alarm(0)意味着关闭闹钟,这一点值得注意。
    • pause细节:
      • pause挂起一个进程直到一个信号到达。如果调用进程被这个信号终止,pause没有返回。如果调用进程用一个处理函数捕获,则在控制从处理函数处返回后pause返回。这种情况下,errno被设置为EINTR。
    • 计时器的另一个用途:
      • 在将来的某个时刻发生的动作同时做一些其他事情。调度一个将要发生的动作很简单,通过alarm来设置计时器,然后继续做别的事情。当计时器计到0,处理函数被调用。
      • Unix很早就有sleep和alarm,提供的计时精度为秒。后来一个更强大和使用广泛的计时系统被引用。新的计时系统使用“间隔计时器”的概念,精度更高。
      • 每个进程都有3个独立的计时器,而不是原来的一个。
        1. ITIMER_REAL,真实时间——SIGALRM
        2. ITIMER_VIRTUAL,进程时间:用户时间——SIGVTALRM
        3. ITIMER_PROF,实用时间:用户时间+系统时间——SIGPROF
      • 每个计时器都有两个设置:初始间隔和重复间隔设置。
        1. 初始间隔:一次延时
        2. 重复间隔:延时重复
        3. 举例:医生给你一些药,告诉你:过一小时吃第一粒,然后每隔4小时吃一粒。
      • 新的系统还支持alarm和sleep。
    • 用间隔计时器编程:
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值