Linux下实现mysleep并分析

对于这个问题,我们首先可以想到的是使用pause()函数和alarm()函数进行组合,这样就可以实现sleep函数的作用。

首先来看pause函数的作用

 接着来看SIGALRM信号(man 7 signal):

由此我们可以看到SIGALRM默认的Action是Term。

 而Term的默认动作是终止进程。

所以我们可以做如下实验,当我们没有信号捕捉的时候会发生什么样的情况?

运行结果:

 此时并没有输出“after pause”,在程序执行的过程中,遇到pause程序被挂起之后,当2s之后,发来SIGALRM信号,由于没有重写SIGALRM信号的处理函数,所以系统默认终止该进程。

我们再来看看,当有默认处理函数的时候:

 执行结果:

这个时候可以看到,我们想要看到的效果成功了。

在尝试一下其他方法(使用kill命令来发送SIGALRM信号):

执行kill命令:

运行结果:

 这个过程也就十分的清晰明了了,当然这里并没有使用比较复杂代码和深层次的探究。

如果有错误,还请指正。

源码:

1 #include <unistd.h>
2 #include <stdio.h>
3 int main()
4 { 
5 alarm(2);                                                               
6 printf("alarm start!\n");
7 pause();
8 printf("after pause!\n");
9 }

 

 1 #include <unistd.h>
 2 #include <stdio.h>
 3 #include <signal.h>
 4 void fun(int id){
 5     printf("this is function \n");
 6 }
 7 int main()
 8 {
 9     signal(SIGALRM,fun);
10     alarm(2);
11     printf("alarm start!\n");
12     pause();
13     printf("after pause!\n");
14 }   

参考链接:

  https://segmentfault.com/q/1010000020536343

posted @ 2020-05-11 09:50  缄默先生  阅读(247)  评论(0编辑  收藏  举报