linux sleep()的实现原理

http://www.judymax.com/archives/235

sleep()的实现分为三步:

            1.注册一个信号signal(SIGALRM,handler)。接收内核给出的一个信号。

            2.调用alarm()函数。

            3.pause()挂起进程。

实例代码:

#include <stdio.h>

#include <stdlib.h>

#include <signal.h>

#include <unistd.h>

///时钟编程 alarm()

void wakeUp()

{

      printf("please wakeup!!/n");

}

int main(void) {

      printf("you have 4 s sleep!/n");

     signal(SIGALRM,wakeUp);

     alarm(4);

     pause();

     printf("good morning!/n");

    return EXIT_SUCCESS;

}

分析:我认为关键的是pause().当执行到这个函数的时候,当前进程被挂起,等时钟alarm函数4秒之后,内核发送一个SIGALRM信号。导致控制从pause函数转到信号的处理函数。信号处理函数中的代码被执行,然后控制返回。当信号被处理完毕之后,pause函数返回,进程继续。

执行结果是:

you have 4 s sleep!

please wakeup!!

good morning!