linux 下实现sleep详解及简单实例

sleep:
普通版本
1、基本设计思路:
1>注册SIGALRM信号的处理函数;
2>调用alarm(nsecs)设定闹钟;
3>调⽤pause等待,内核切换到别的进程运行;
4>nsecs秒之后,闹钟超时,内核发SIGALRM给这个进程 ;
5>从内核态返回这个进程的⽤户态之前处理未决信号,发现有SIGALRM信号,其处理函数是sig_alrm;
6> 切换到用户态执行sig_alrm函数,进⼊sig_alrm函数时SIGALRM信号被⾃动屏蔽,从sig_alrm函数返回SIGALRM信 号⾃动解除屏蔽。然后⾃动执⾏系统调用sigreturn再次进入内核,再返回用户态继续执行进程的主控制流程(main函数调⽤的mysleep函数);
7>pause函数返回-1,然后调⽤alarm(0)取消闹钟,调⽤sigaction恢复SIGALRM信号以前的处理动作。
2、实现代码
#include<stdio.h>
#include<signal.h>
void handler(int signo)
{}
int mysleep(int timeout)
{
struct sigaction act,oact;
act.sa_handler = handler;
act.sa_flags = 0;
sigemptyset(&act.sa_mask);
sigaction(SIGALRM,&act,&oact);
alarm(timeout);
pause();
int ret = alarm(0);
sigaction(SIGALRM,&oact,NULL);
return ret;
}
int main()
{
while(1)
{
printf("using musleep!\n");
mysleep(3);
}
return 0;
}
相关函数分析:
#include <unistd.h> int pause(void);
pause函数使调⽤进程挂起直到有信号递达。如果信号的处理动作是终⽌进程,则进程终⽌,pause函数没有机会返回;如果信号的处理动作是忽略,则进程继续处于挂起状态,pause不返回;如果信号的处理动作是捕捉,则调⽤了信号处理函数之后pause返回-1,errno设置为EINTR, 所以pause只有出错的返回值 。
sigaction函数
#include <signal.h> int sigaction(int signo, const struct sigaction *act, struct sigaction *oact);
sigaction函数可以读取和修改与指定信号相关联的处理动作。调⽤成功则返回0,出错则返回- 1。 signo是指定信号的编号。若act指针⾮空,则根据act修改该信号的处理动作。若oact指针非 空,则通过oact传出该信号原来的处理动作。
int sigemptyset(sigset_t *set);
函数sigemptyset初始化set所指向的信号集,使其中所有信号的对应bit清零,表⽰该信号集不包含 任何有效信号。
二、优化版本
所需函数分析
#include <signal.h> int sigsuspend(const sigset_t *sigmask);
sigsuspend没有成功返回值,只有执⾏了⼀个信号处理函数之后sigsuspend才返回,返回值为-1,errno设置为EINTR。调⽤sigsuspend时,进程的信号屏蔽字由sigmask参数指定,可以通过指定sigmask来临时解除对某 个信号的屏蔽,然后挂起等待,当sigsuspend返回时,进程的信号屏蔽字恢复为原来的值,如果原来对该信号是屏蔽的,sigsuspend返回后仍然是屏蔽的。
sigsuspend函数与pause函数:都可以将程序挂起,但是sigsuspend函数可以实现对信号屏蔽字的解除与挂起。
sigprocmask
调⽤函数sigprocmask可以读取或更改进程的信号屏蔽字(阻塞信号集)。
#include <signal.h> int sigprocmask(int how, const sigset_t *set, sigset_t *oset);
如果oset是⾮空指针,则读取进程的当前信号屏蔽字通过oset参数传出。如果set是⾮空指针,则 更改进程的信号屏蔽字,参数how指⽰如何更改。如果oset和set都是⾮空指针,则先将原来的信号 屏蔽字备份到oset⾥,然后根据set和how参数更改信号屏蔽字。
how的选项意义
如果调⽤sigprocmask解除了对当前若⼲个未决信号的阻塞,则在sigprocmask返回前,⾄少将其中⼀个信号递达。
代码实现:
#include<stdio.h>
#include<signal.h>
void handler(int signo)
{}
int mysleep(int timout)
{
struct sigaction act,oact;
sigset_t newmask,oldmask,suspmask;
act.sa_handler = handler;
act.sa_flags = 0;
sigemptyset(&act.sa_mask);
sigaction(SIGALRM,&act,&oact);
sigemptyset(&newmask);
sigaddset(&newmask,SIGALRM);
sigprocmask(SIG_BLOCK,&newmask,&oldmask);
alarm(timout);
suspmask = oldmask;
sigdelset(&suspmask,SIGALRM);
sigsuspend(&suspmask);
int unslept = alarm(0);
sigaction(SIGALRM,&oact,NULL);
sigprocmask(SIG_SETMASK,&oldmask,NULL);
return(unslept);
}
int main()
{
while(1)
{
printf("using musleep!\n");
mysleep(3);
}
return 0;
}
优化版本解决了普通版本存在的竞态问题。我们重新审视一下普通版本的时序问题。
1、设置SIGALRM信号的处理函数;
2、调用alarm()函数设置闹钟;
3、内核选取更高优先级的进程来取代当前进程,并且这样的进程很多,同时执行时间又很长;
4、闹钟超时了,内核发送SIGALRM信号给该进程,并且处于未决状态;
5、优先级更高的进程结束后,内核要调度回这个进程执⾏。 SIGALRM信号递达,执⾏处理函 数sig_alrm之后再次进⼊内核。
6、返回这个进程的主控制流程,alarm(nsecs)返回,调⽤pause()挂起等待。
7、可是现在SIGALRM信号已经被处理,进程会导致错误。
在一个进程运行过程中,因为由于异步,所以可能被其他优先级更高的进程,由于时序问题而引发的错误问题。这样的问题称为竞态问题。
优化版本中,先将设置SIGALRM信号的处理函数,然后将SIGALRM信号进行屏蔽,然后调用alarm()函数设置闹钟,然后调用sigprocmask()函数对SIGALRM信号解除屏蔽然后挂起等待,这样就解决了竞态问题。
感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!
# linux
# 下实现sleep
# sleep的实现代码
# Linux模拟实现sleep函数
# 挂起
# 更高
# 设置为
# 先将
# 切换到
# 返回值
# 都是
# 信号处理
# 解决了
# 执行时间
# 所需
# 可以通过
# 希望能
# 使其
# 相关联
# 很长
# 可以实现
# 仍然是
# 谢谢大家
# 则在
相关文章:
如何在云主机上快速搭建多站点网站?
制作营销网站公司,淘特是干什么用的?
专业公司网站制作公司,用什么语言做企业网站比较好?
香港服务器网站测试全流程:性能评估、SEO加载与移动适配优化
,怎么在广州志愿者网站注册?
香港服务器网站搭建教程-电商部署、配置优化与安全稳定指南
建站之家VIP精选网站模板与SEO优化教程整合指南
专业型网站制作公司有哪些,我设计专业的,谁给推荐几个设计师兼职类的网站?
如何通过VPS搭建网站快速盈利?
如何选择服务器才能高效搭建专属网站?
如何配置支付宝与微信支付功能?
建站之星后台密码遗忘?如何快速找回?
如何在Golang中使用encoding/gob序列化对象_存储和传输数据
如何通过虚拟主机空间快速建站?
建站中国必看指南:CMS建站系统+手机网站搭建核心技巧解析
韩国网站服务器搭建指南:VPS选购、域名解析与DNS配置推荐
淘宝制作网站有哪些,淘宝网官网主页?
微信推文制作网站有哪些,怎么做微信推文,急?
网站制作报价单模板图片,小松挖机官方网站报价?
制作宣传网站的软件,小红书可以宣传网站吗?
开心动漫网站制作软件下载,十分开心动画为何停播?
网站设计制作企业有哪些,抖音官网主页怎么设置?
如何高效利用亚马逊云主机搭建企业网站?
建站主机是否等同于虚拟主机?
如何快速搭建安全的FTP站点?
专业网站制作服务公司,有哪些网站可以免费发布招聘信息?
网站制作模板下载什么软件,ppt模板免费下载网站?
头像制作网站在线观看,除了站酷,还有哪些比较好的设计网站?
网站按钮制作软件,如何实现网页中按钮的自动点击?
如何通过服务器快速搭建网站?完整步骤解析
如何用景安虚拟主机手机版绑定域名建站?
网站设计制作公司地址,网站建设比较好的公司都有哪些?
如何注册花生壳免费域名并搭建个人网站?
建站一年半SEO优化实战指南:核心词挖掘与长尾流量提升策略
Swift中swift中的switch 语句
相亲简历制作网站推荐大全,新相亲大会主持人小萍萍资料?
网站制作大概要多少钱一个,做一个平台网站大概多少钱?
,柠檬视频怎样兑换vip?
网站app免费制作软件,能免费看各大网站视频的手机app?
一键制作网站软件下载安装,一键自动采集网页文档制作步骤?
香港服务器选型指南:免备案配置与高效建站方案解析
在线ppt制作网站有哪些软件,如何把网页的内容做成ppt?
高配服务器限时抢购:企业级配置与回收服务一站式优惠方案
如何有效防御Web建站篡改攻击?
C++如何使用std::optional?(处理可选值)
建站主机选择指南:服务器配置与SEO优化实战技巧
如何批量查询域名的建站时间记录?
深圳 网站制作,深圳招聘网站哪个比较好一点啊?
企业在线网站设计制作流程,想建设一个属于自己的企业网站,该如何去做?
如何快速使用云服务器搭建个人网站?
*请认真填写需求信息,我们会在24小时内与您取得联系。