一、普通版本下的sleep函数
前面我们学习了pause函数,知道了pause函数的功能是为了挂起当前的进程,直到有信号递达。有问题的可以参见我的上一篇博客:这篇博客将信号讲的很清楚,其中对于pause函数也做了相应的说明。
linux下的信号
今天我就是用这个pause函数来实现一个自己的sleep函数。
具体实现原理如图所示:
实现过程如下:
1、main函数调用了my_sleep函数,mysleep函数注册了SIGALRM信号的处理函数handler。
2、alarm函数设定的是闹钟,调用pause函数进行等待,在times秒之后内核发送SIGALRM信号给进程。
3、发现SIGALRM信号调用它的handler函数,切换到用户态执行handler函数,进入handler函数时SIGALRM信号被自动屏蔽, 从handler函数返回时SIGALRM信号自动解除屏蔽。再返回用户态
4、pause函数返回-1,调用alarm(0)取消闹钟调用sigaction恢复SIGALRM信号以前的处理动作。
具体代码如下:
#include<stdio.h>