位置: 编程技术 - 正文
推荐整理分享linux 下实现sleep详解及简单实例(linux sleep 2),希望有所帮助,仅作参考,欢迎阅读内容。
文章相关热门搜索词:linux中sleep,关于linux 中sleep()函数说明,linux sleep 0,linux sleep 0,linux sleep进程,linux sleep进程,linuxsleep函数,linux中sleep,内容如对您有帮助,希望把文章链接给更多的朋友!
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、实现代码
相关函数分析:
pause函数使调进程挂起直到有信号递达。如果信号的处理动作是终进程,则进程终,pause函数没有机会返回;如果信号的处理动作是忽略,则进程继续处于挂起状态,pause不返回;如果信号的处理动作是捕捉,则调了信号处理函数之后pause返回-1,errno设置为EINTR, 所以pause只有出错的返回值 。
sigaction函数
sigaction函数可以读取和修改与指定信号相关联的处理动作。调成功则返回0,出错则返回- 1。 signo是指定信号的编号。若act指针空,则根据act修改该信号的处理动作。若oact指针非 空,则通过oact传出该信号原来的处理动作。
函数sigemptyset初始化set所指向的信号集,使其中所有信号的对应bit清零,表该信号集不包含 任何有效信号。
二、优化版本
所需函数分析
sigsuspend没有成功返回值,只有执了个信号处理函数之后sigsuspend才返回,返回值为-1,errno设置为EINTR。调sigsuspend时,进程的信号屏蔽字由sigmask参数指定,可以通过指定sigmask来临时解除对某 个信号的屏蔽,然后挂起等待,当sigsuspend返回时,进程的信号屏蔽字恢复为原来的值,如果原来对该信号是屏蔽的,sigsuspend返回后仍然是屏蔽的。 sigsuspend函数与pause函数:都可以将程序挂起,但是sigsuspend函数可以实现对信号屏蔽字的解除与挂起。
sigprocmask
调函数sigprocmask可以读取或更改进程的信号屏蔽字(阻塞信号集)。
如果oset是空指针,则读取进程的当前信号屏蔽字通过oset参数传出。如果set是空指针,则 更改进程的信号屏蔽字,参数how指如何更改。如果oset和set都是空指针,则先将原来的信号 屏蔽字备份到oset,然后根据set和how参数更改信号屏蔽字。
how的选项意义
如果调sigprocmask解除了对当前若个未决信号的阻塞,则在sigprocmask返回前,少将其中个信号递达。
代码实现:
优化版本解决了普通版本存在的竞态问题。我们重新审视一下普通版本的时序问题。
1、设置SIGALRM信号的处理函数;
2、调用alarm()函数设置闹钟;
3、内核选取更高优先级的进程来取代当前进程,并且这样的进程很多,同时执行时间又很长;
4、闹钟超时了,内核发送SIGALRM信号给该进程,并且处于未决状态;
5、优先级更高的进程结束后,内核要调度回这个进程执。 SIGALRM信号递达,执处理函 数sig_alrm之后再次进内核。
6、返回这个进程的主控制流程,alarm(nsecs)返回,调pause()挂起等待。
7、可是现在SIGALRM信号已经被处理,进程会导致错误。
在一个进程运行过程中,因为由于异步,所以可能被其他优先级更高的进程,由于时序问题而引发的错误问题。这样的问题称为竞态问题。
优化版本中,先将设置SIGALRM信号的处理函数,然后将SIGALRM信号进行屏蔽,然后调用alarm()函数设置闹钟,然后调用sigprocmask()函数对SIGALRM信号解除屏蔽然后挂起等待,这样就解决了竞态问题。
感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!
使用ntpdate工具校正linux服务器时间(实现方法) 当Linux服务器的时间不对的时候,可以使用ntpdate工具来校正时间。安装:yuminstallntpdatentpdate简单用法:#ntpdateip#ntpdate...以下是一些可用的NTP服务
Linux bash删除文件中含“指定内容”的行功能示例 本文实例讲述了Linuxbash删除文件中含指定内容的行功能。分享给大家供大家参考,具体如下:#!/bin/sh#功能:删除文件中含"指定内容"的行#运行方式:./dline.
Vim中列出TODO与FIXME等备注的方法 前言很多程序员,包括我,会在写代码的时候,习惯性的用TODO,FIXME,HACK等作为一些注释的前缀。这样方便自己和后来者预先知道相关注释和代码的状况
标签: linux sleep 2
本文链接地址:https://www.jiuchutong.com/biancheng/376745.html 转载请保留说明!友情链接: 武汉网站建设