首页 > 系统服务 > 详细

Linux下实现mysleep并分析

时间:2020-05-11 10:08:00      阅读:74      评论:0      收藏:0      [点我收藏+]

对于这个问题,我们首先可以想到的是使用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

Linux下实现mysleep并分析

原文:https://www.cnblogs.com/jianmoxiansheng-Guo/p/12867248.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!