欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Linux模擬實(shí)現(xiàn)sleep函數(shù)

 更新時(shí)間:2017年04月27日 16:19:36   作者:Hyacinth_Dy  
這篇文章主要為大家詳細(xì)介紹了Linux模擬實(shí)現(xiàn)sleep函數(shù),讓程序休眠一定的秒數(shù),到時(shí)間后自動(dòng)恢復(fù)運(yùn)行

先來說說工作原理,linux中的sleep函數(shù)能夠讓程序休眠一定的秒數(shù),到時(shí)間后自動(dòng)恢復(fù)運(yùn)行。

實(shí)現(xiàn)思路

設(shè)定睡眠的秒數(shù)
睡眠(掛起)
恢復(fù)運(yùn)行

實(shí)現(xiàn)機(jī)制

設(shè)定睡眠的秒數(shù):采用alarm()函數(shù)設(shè)定需要睡眠的秒數(shù),到時(shí)間后鬧鐘會(huì)發(fā)送SIGALRM信號(hào)給當(dāng)前進(jìn)程。但SIGALRM信號(hào)的默認(rèn)操作是終止進(jìn)程,所以我們需要對(duì)SIGALRM信號(hào)進(jìn)行自定義處理。
睡眠:pause()函數(shù)會(huì)讓當(dāng)前進(jìn)程掛起,直到收到信號(hào)才會(huì)出錯(cuò)返回。

示例程序代碼:模擬實(shí)現(xiàn)sleep使當(dāng)前進(jìn)程每2秒打印”hello yingying\n”

#include<stdio.h>
#include<unistd.h>
#include<signal.h>
void handler(int signo)//由于程序在睡眠期間什么也不做所以自定義處理函數(shù)不執(zhí)行任何操作
{
}
int mysleep(int time)
{
 sigset_t set;
 sigemptyset(&set);
 struct sigaction act;
 struct sigaction oact;
 act.sa_handler = handler;//自定義處理函數(shù)
 act.sa_mask = set;
 act.sa_flags = 0; 
 sigaction(SIGALRM,&act,&oact);//捕捉鬧鐘信號(hào)自定義處理動(dòng)作
 alarm(time);//time秒后給進(jìn)程發(fā)送信號(hào)
 pause();//掛起進(jìn)程
 int _time = alarm(0);//如果程序被提前喚醒取消鬧鐘
 sigaction(SIGALRM,&oact,NULL);//恢復(fù)捕捉信號(hào)的原始狀態(tài)
 return _time;
}
int main()
{
 while(1)
 {
 printf("hello yingying\n");
 mysleep(2);
 }
 return 0;
}

問題分析

上述代碼在看似沒有問題可以實(shí)現(xiàn)我們需要的結(jié)果,但是帶 多執(zhí)行流下仍可以正常運(yùn)行嗎?例如在設(shè)定了鬧鐘后當(dāng)前進(jìn)程被切換出去,等再切換回來鬧鐘已經(jīng)響過了,那么當(dāng)前進(jìn)程就會(huì)被永遠(yuǎn)掛起。所以我們需要優(yōu)化上面的程序。

.優(yōu)化方案一:
1.屏蔽SIGALRM信號(hào)
2.alarm(time)
3.解除屏蔽SIGALRM信號(hào)
4.pause()

.優(yōu)化方案二:
1.屏蔽SIGALRM信號(hào)
2.alarm(time)
3.pause()
4.解除屏蔽SIGALRM信號(hào)

這兩種方案大家思考一下可行嗎?應(yīng)該選哪個(gè)呢?

方案選擇

對(duì)于方案一:如果進(jìn)程在解除屏蔽之后,pause()之前的的間隙被切走仍會(huì)造成同樣的問題,進(jìn)程也可能被永遠(yuǎn)掛起。
對(duì)于方案二:程序掛起之后,鬧鐘信號(hào)被屏蔽,一直處于未決狀態(tài),程序無法收到信號(hào),進(jìn)程也就會(huì)被一直掛起。所以方案二是不可以選擇的。
對(duì)于方案一我們可以改進(jìn),使解除阻塞與掛起成為一個(gè)原子操作這樣就可以解決我們的問題了。

解決問題

像方案一這種由時(shí)序問題導(dǎo)致程序出現(xiàn)問題的情況成為競態(tài)條件。sigsuspend()函數(shù)可以實(shí)現(xiàn)pause()函數(shù)的掛起功能,同時(shí)也能解決競態(tài)條件的問題。sigsuspend()函數(shù)的功能就是-“解除信號(hào)屏蔽”-“掛起進(jìn)程等待信號(hào)”-“執(zhí)行信號(hào)處理函數(shù)”- “出錯(cuò)返回”。所以sigsuspend()函數(shù)函數(shù)同pause()函數(shù)一樣只有出錯(cuò)返回值。在對(duì)程序時(shí)序要求比較嚴(yán)格的程序中一般使用sigsuspend()函數(shù)。

優(yōu)化后的程序代碼

#include<stdio.h>
#include<unistd.h>
#include<signal.h>
void handler(int signo)
{
}
int mysleep(int time)
{
 sigset_t set,oset,susmask;
 sigemptyset(&set);
 sigaddset(&set,SIGALRM);
 sigprocmask(SIG_BLOCK,&set,&oset);
 struct sigaction act;
 struct sigaction oact;
 act.sa_handler = handler;
 act.sa_mask = set;
 act.sa_flags = 0; 
 sigaction(SIGALRM,&act,&oact);
 alarm(time);
 susmask = oset;
 sigdelset(&susmask,SIGALRM);
 sigsuspend(&susmask);
 int _time = alarm(0);
 sigaction(SIGALRM,&oact,NULL);
 sigprocmask(SIG_BLOCK,&oset,NULL);
 return _time;
}
int main()
{
 while(1)
 {
 printf("hello yingying\n");
 mysleep(2);
 }
 return 0;
}

這樣我們的sleep函數(shù)的模擬實(shí)現(xiàn)就完成了。

程序結(jié)果

以上就是本文的全部內(nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • Gunicorn運(yùn)行與配置方法

    Gunicorn運(yùn)行與配置方法

    這篇文章主要介紹了Gunicorn運(yùn)行與配置方法,使用pre-fork worker模式,具有使用非常簡單,輕量級(jí)的資源消耗,以及高性能等特點(diǎn)。對(duì)此感興趣的朋友跟隨小編一起看看吧
    2019-08-08
  • centos6編譯及安裝ZLMediaKit解析

    centos6編譯及安裝ZLMediaKit解析

    這篇文章主要介紹了centos6編譯及安裝ZLMediaKit,需要的朋友可以參考下
    2019-11-11
  • Linux下亂碼問題的解決方案小結(jié)

    Linux下亂碼問題的解決方案小結(jié)

    linux系統(tǒng)中文件名內(nèi)容為urf8編碼, windows系統(tǒng)中文件名默認(rèn)為gbk編碼, 多數(shù)文檔使用gbk編碼,系統(tǒng)采用utf8編碼.這篇文章主要介紹了Linux下亂碼問題的解決方案,需要的朋友可以參考下
    2016-10-10
  • Linux下的chkconfig命令詳解

    Linux下的chkconfig命令詳解

    大家都知道chkconfig命令在linux中使用是非常的關(guān)鍵的,我們可以利用chkconfig來對(duì)系統(tǒng)的一些啟動(dòng)與禁止相關(guān)設(shè)置,下面這篇文章小編就來給大家詳細(xì)的介紹Linux下的chkconfig命令用法,有需要的朋友們可以參考學(xué)習(xí),下面來一起看看吧。
    2016-11-11
  • Linux下Apache HTTP Server 2.4.26安裝教程

    Linux下Apache HTTP Server 2.4.26安裝教程

    這篇文章主要為大家詳細(xì)介紹了Linux下Apache HTTP Server 2.4.26的安裝,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-07-07
  • ubuntu下迅雷極速版的安裝與使用

    ubuntu下迅雷極速版的安裝與使用

    Ubuntu是一個(gè)完全基于Linux的操作系統(tǒng),它不但免費(fèi),而且有專業(yè)人員和業(yè)余愛好者共同為其提供技術(shù)支持。迅雷極速版的推出吸引了眾多追求速度的網(wǎng)友關(guān)注。那么這篇文章我們就來學(xué)習(xí)下在ubuntu下迅雷極速版與QQ旋風(fēng)的安裝與使用,有需要的朋友們下面來一起看看吧。
    2016-10-10
  • 詳解CentOS8更換yum源后出現(xiàn)同步倉庫緩存失敗的問題

    詳解CentOS8更換yum源后出現(xiàn)同步倉庫緩存失敗的問題

    這篇文章主要介紹了詳解CentOS8更換yum源后出現(xiàn)同步倉庫緩存失敗的問題,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-03-03
  • Linux下“/”和“~”的區(qū)別詳解

    Linux下“/”和“~”的區(qū)別詳解

    這篇文章主要介紹了Linux下“/”和“~”的區(qū)別詳解,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-09-09
  • linux Apache CGI 安裝配置

    linux Apache CGI 安裝配置

    Apache 中的提交了一種利用擴(kuò)展應(yīng)用程序執(zhí)行動(dòng)態(tài)網(wǎng)頁的機(jī)制. 稱為Common Gateway Interface (通用網(wǎng)關(guān)接口)簡稱CGI.
    2009-05-05
  • Linux使用shell腳本定時(shí)刪除歷史日志文件

    Linux使用shell腳本定時(shí)刪除歷史日志文件

    這篇文章主要介紹了Linux使用shell腳本定時(shí)刪除歷史日志文件,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-08-08

最新評(píng)論