linux下sleep函数原理及实现

在linux下的C语言编程中,sleep函数可以方便地使进程按休眠一定的秒数,到了点后再自动恢复运行。然而sleep函数也是有几个过程组合而成的,其中就包括了对于linux信号的应用。

我将全文分为4个部分:

  1. 工作原理
  2. 设定要睡的秒数、起床
  3. 睡觉的实现
  4. 示例程序及注释

工作原理

a) 设定要睡的秒数
b) 睡觉
c) 到点起床

设定要睡的秒数、起床

每个进程都有一个私有闹钟,可以通过 alarm(秒数) 函数设定闹钟,到点时,私有闹钟会发送信号SIGALRM给进程。如果没有绑定自定义处理函数的话,默认的操作是杀死进程。显然在sleep函数的实现中,安排了一个自定义函数,且这个函数没有内容,只是防止进程关闭而已。

睡觉的实现

pause()函数可以挂起进程。

示例程序及注释

在这个程序中,模仿了sleep函数的实现,并实现了定时4秒。程序效果如下:

image

#include
#include

#define SHHHH

main()
{
    //声明信号处理函数
    void wakeup(int);
    //本程序设定睡眠时间4秒
    printf("about to sleep for 4 secondsn");
    //将信号SIGALRM与处理函数wakeup绑定
    signal(SIGALRM,wakeup);
    //调用私有闹钟定时4秒
    alarm(4);
    //将进程挂起,坐等到点
    pause();
    //只有到了点,调用了wakeup(因为我们定义了SHHHH)
    //所以wakeup没有显示,但程序恢复运行
    //从pause()处往下运行
    printf("Morning so soon?n");
}

void wakeup(int signum)
{
#ifndef SHHHH
    printf("Alarm received from kerneln");
#endif
}