欧美阿v视频在线大全_亚洲欧美中文日韩V在线观看_www性欧美日韩欧美91_亚洲欧美日韩久久精品

主頁 > 知識(shí)庫 > linux 下實(shí)現(xiàn)sleep詳解及簡(jiǎn)單實(shí)例

linux 下實(shí)現(xiàn)sleep詳解及簡(jiǎn)單實(shí)例

熱門標(biāo)簽:400的電話一般從哪里辦理 怎么用百度地圖標(biāo)注坐標(biāo) 上海機(jī)器人外呼系統(tǒng)哪家好 地圖標(biāo)注人員分布 江西全自動(dòng)外呼系統(tǒng)報(bào)價(jià) 梧州防封電銷卡 春運(yùn)地圖標(biāo)注app 昆明電銷機(jī)器人價(jià)格 益陽400電話申請(qǐng)辦理流程

linux 下實(shí)現(xiàn)sleep詳解及簡(jiǎn)單實(shí)例

sleep:

普通版本

1、基本設(shè)計(jì)思路:

   1>注冊(cè)SIGALRM信號(hào)的處理函數(shù);
   2>調(diào)用alarm(nsecs)設(shè)定鬧鐘;

   3>調(diào)⽤pause等待,內(nèi)核切換到別的進(jìn)程運(yùn)行;

   4>nsecs秒之后,鬧鐘超時(shí),內(nèi)核發(fā)SIGALRM給這個(gè)進(jìn)程 ;

   5>從內(nèi)核態(tài)返回這個(gè)進(jìn)程的⽤戶態(tài)之前處理未決信號(hào),發(fā)現(xiàn)有SIGALRM信號(hào),其處理函數(shù)是sig_alrm;

   6> 切換到用戶態(tài)執(zhí)行sig_alrm函數(shù),進(jìn)⼊sig_alrm函數(shù)時(shí)SIGALRM信號(hào)被⾃動(dòng)屏蔽,從sig_alrm函數(shù)返回SIGALRM信 號(hào)⾃動(dòng)解除屏蔽。然后⾃動(dòng)執(zhí)⾏系統(tǒng)調(diào)用sigreturn再次進(jìn)入內(nèi)核,再返回用戶態(tài)繼續(xù)執(zhí)行進(jìn)程的主控制流程(main函數(shù)調(diào)⽤的mysleep函數(shù));

   7>pause函數(shù)返回-1,然后調(diào)⽤alarm(0)取消鬧鐘,調(diào)⽤sigaction恢復(fù)SIGALRM信號(hào)以前的處理動(dòng)作。

2、實(shí)現(xiàn)代碼

#includestdio.h> 
#includesignal.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; 
} 

相關(guān)函數(shù)分析:

#include unistd.h> 
int pause(void); 

pause函數(shù)使調(diào)⽤進(jìn)程掛起直到有信號(hào)遞達(dá)。如果信號(hào)的處理動(dòng)作是終⽌進(jìn)程,則進(jìn)程終⽌,pause函數(shù)沒有機(jī)會(huì)返回;如果信號(hào)的處理動(dòng)作是忽略,則進(jìn)程繼續(xù)處于掛起狀態(tài),pause不返回;如果信號(hào)的處理動(dòng)作是捕捉,則調(diào)⽤了信號(hào)處理函數(shù)之后pause返回-1,errno設(shè)置為EINTR, 所以pause只有出錯(cuò)的返回值 。

sigaction函數(shù)

#include signal.h> 
int sigaction(int signo, const struct sigaction *act, struct 
sigaction *oact); 

sigaction函數(shù)可以讀取和修改與指定信號(hào)相關(guān)聯(lián)的處理動(dòng)作。調(diào)⽤成功則返回0,出錯(cuò)則返回- 1。 signo是指定信號(hào)的編號(hào)。若act指針⾮空,則根據(jù)act修改該信號(hào)的處理動(dòng)作。若oact指針非 空,則通過oact傳出該信號(hào)原來的處理動(dòng)作。 

int sigemptyset(sigset_t *set); 

函數(shù)sigemptyset初始化set所指向的信號(hào)集,使其中所有信號(hào)的對(duì)應(yīng)bit清零,表⽰該信號(hào)集不包含 任何有效信號(hào)。

二、優(yōu)化版本

所需函數(shù)分析

#include signal.h>
 
int sigsuspend(const sigset_t *sigmask); 

sigsuspend沒有成功返回值,只有執(zhí)⾏了⼀個(gè)信號(hào)處理函數(shù)之后sigsuspend才返回,返回值為-1,errno設(shè)置為EINTR。調(diào)⽤sigsuspend時(shí),進(jìn)程的信號(hào)屏蔽字由sigmask參數(shù)指定,可以通過指定sigmask來臨時(shí)解除對(duì)某 個(gè)信號(hào)的屏蔽,然后掛起等待,當(dāng)sigsuspend返回時(shí),進(jìn)程的信號(hào)屏蔽字恢復(fù)為原來的值,如果原來對(duì)該信號(hào)是屏蔽的,sigsuspend返回后仍然是屏蔽的。
sigsuspend函數(shù)與pause函數(shù):都可以將程序掛起,但是sigsuspend函數(shù)可以實(shí)現(xiàn)對(duì)信號(hào)屏蔽字的解除與掛起。

sigprocmask

調(diào)⽤函數(shù)sigprocmask可以讀取或更改進(jìn)程的信號(hào)屏蔽字(阻塞信號(hào)集)。

#include signal.h>
 
int sigprocmask(int how, const sigset_t *set, sigset_t *oset); 

如果oset是⾮空指針,則讀取進(jìn)程的當(dāng)前信號(hào)屏蔽字通過oset參數(shù)傳出。如果set是⾮空指針,則 更改進(jìn)程的信號(hào)屏蔽字,參數(shù)how指⽰如何更改。如果oset和set都是⾮空指針,則先將原來的信號(hào) 屏蔽字備份到oset⾥,然后根據(jù)set和how參數(shù)更改信號(hào)屏蔽字。

how的選項(xiàng)意義


如果調(diào)⽤sigprocmask解除了對(duì)當(dāng)前若⼲個(gè)未決信號(hào)的阻塞,則在sigprocmask返回前,⾄少將其中⼀個(gè)信號(hào)遞達(dá)。

代碼實(shí)現(xiàn):

#includestdio.h> 
#includesignal.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; 
} 

優(yōu)化版本解決了普通版本存在的競(jìng)態(tài)問題。我們重新審視一下普通版本的時(shí)序問題。

1、設(shè)置SIGALRM信號(hào)的處理函數(shù);

2、調(diào)用alarm()函數(shù)設(shè)置鬧鐘;

3、內(nèi)核選取更高優(yōu)先級(jí)的進(jìn)程來取代當(dāng)前進(jìn)程,并且這樣的進(jìn)程很多,同時(shí)執(zhí)行時(shí)間又很長(zhǎng);

4、鬧鐘超時(shí)了,內(nèi)核發(fā)送SIGALRM信號(hào)給該進(jìn)程,并且處于未決狀態(tài);

5、優(yōu)先級(jí)更高的進(jìn)程結(jié)束后,內(nèi)核要調(diào)度回這個(gè)進(jìn)程執(zhí)⾏。 SIGALRM信號(hào)遞達(dá),執(zhí)⾏處理函 數(shù)sig_alrm之后再次進(jìn)⼊內(nèi)核。

6、返回這個(gè)進(jìn)程的主控制流程,alarm(nsecs)返回,調(diào)⽤pause()掛起等待。

7、可是現(xiàn)在SIGALRM信號(hào)已經(jīng)被處理,進(jìn)程會(huì)導(dǎo)致錯(cuò)誤。

在一個(gè)進(jìn)程運(yùn)行過程中,因?yàn)橛捎诋惒剑钥赡鼙黄渌麅?yōu)先級(jí)更高的進(jìn)程,由于時(shí)序問題而引發(fā)的錯(cuò)誤問題。這樣的問題稱為競(jìng)態(tài)問題。

優(yōu)化版本中,先將設(shè)置SIGALRM信號(hào)的處理函數(shù),然后將SIGALRM信號(hào)進(jìn)行屏蔽,然后調(diào)用alarm()函數(shù)設(shè)置鬧鐘,然后調(diào)用sigprocmask()函數(shù)對(duì)SIGALRM信號(hào)解除屏蔽然后掛起等待,這樣就解決了競(jìng)態(tài)問題。

感謝閱讀,希望能幫助到大家,謝謝大家對(duì)本站的支持!

您可能感興趣的文章:
  • Linux模擬實(shí)現(xiàn)sleep函數(shù)

標(biāo)簽:亳州 贛州 河南 惠州 新疆 北京 九江 懷化

巨人網(wǎng)絡(luò)通訊聲明:本文標(biāo)題《linux 下實(shí)現(xiàn)sleep詳解及簡(jiǎn)單實(shí)例》,本文關(guān)鍵詞  linux,下,實(shí)現(xiàn),sleep,詳解,;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問題,煩請(qǐng)?zhí)峁┫嚓P(guān)信息告之我們,我們將及時(shí)溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無關(guān)。
  • 相關(guān)文章
  • 下面列出與本文章《linux 下實(shí)現(xiàn)sleep詳解及簡(jiǎn)單實(shí)例》相關(guān)的同類信息!
  • 本頁收集關(guān)于linux 下實(shí)現(xiàn)sleep詳解及簡(jiǎn)單實(shí)例的相關(guān)信息資訊供網(wǎng)民參考!
  • 推薦文章
    欧美阿v视频在线大全_亚洲欧美中文日韩V在线观看_www性欧美日韩欧美91_亚洲欧美日韩久久精品
  • <rt id="w000q"><acronym id="w000q"></acronym></rt>
  • <abbr id="w000q"></abbr>
    <rt id="w000q"></rt>
    日本一区二区三区四区| 91热门视频在线观看| 实拍女处破www免费看| 欧美一级日韩一级| 天天综合网天天综合色| 日本一区二区在线观看视频| 欧美日韩精品一区视频| 亚洲午夜一区二区| 久久久久国产免费| 欧美乱妇15p| 午夜成人免费电影| 国产网站无遮挡| 欧美va日韩va| 久久99九九99精品| 久久久久亚洲av无码a片| 久久久久久久网| 国产一区二区不卡| 一级性生活免费视频| 中文字幕一区二区三区色视频| 丁香六月久久综合狠狠色| 久久高清内射无套| 亚洲乱码日产精品bd| 国产香蕉精品视频| 7777精品伊人久久久大香线蕉完整版| 婷婷夜色潮精品综合在线| 黑人巨大精品欧美| 国产午夜亚洲精品午夜鲁丝片| 国产91丝袜在线观看| 91久久精品日日躁夜夜躁欧美| 一级特黄大欧美久久久| 800av在线播放| 久久久久久久免费视频了| 国产成人av一区| 91激情在线视频| 视频一区中文字幕| 国产伦理片在线观看| 国产精品乱码一区二区三区软件 | 久久精品一区二区三区av| 国产精品亚洲午夜一区二区三区 | 国产传媒国产传媒| 成人性生交大免费看| 国产农村妇女毛片精品久久麻豆| jlzzjlzz亚洲女人18| 欧美理论片在线| 久久丁香综合五月国产三级网站| 99热99这里只有精品| 亚洲最新在线观看| caopeng视频| 亚洲少妇中出一区| 亚洲av无码成人精品国产| 国产日韩欧美电影| 亚洲午夜精品在线观看| 欧美va在线播放| 不卡一二三区首页| 日韩欧美中文字幕制服| 国产suv精品一区二区6| 欧美精选在线播放| 国产福利91精品一区二区三区| 欧美视频一区二区三区在线观看 | 婷婷开心久久网| 黑人操日本美女| 亚洲mv大片欧洲mv大片精品| 精品一区二区6| 亚洲国产成人高清精品| 日韩av片在线免费观看| 一区二区欧美国产| 一级片黄色录像| 午夜精品成人在线视频| 亚洲 欧美 变态 另类 综合| 日韩电影网1区2区| 成年人av电影| 久久www免费人成看片高清| 在线观看一区二区精品视频| 精品中文av资源站在线观看| 欧美三级中文字幕| 国产传媒久久文化传媒| 欧美一级视频精品观看| 91色乱码一区二区三区| 国产日韩欧美a| 亚洲第一黄色网址| 悠悠色在线精品| 99热这里只有精品4| 日本va欧美va瓶| 在线观看视频一区二区| 国产精品18久久久久久久网站| 欧美一区二区日韩| 国产又粗又猛又爽又黄| 国产精品乱码一区二区三区软件 | 欧美va亚洲va| 无码国产精品一区二区免费式直播| 中文字幕免费在线观看视频一区| 制服丝袜第二页| 亚洲国产精品自拍| 色狠狠色噜噜噜综合网| 国产成人免费av在线| 26uuu精品一区二区| 老司机免费视频| 在线观看xxx| 精品亚洲国内自在自线福利| 欧美一区二区三区在线观看视频 | 成人免费毛片糖心| 亚洲国产乱码最新视频| 91福利国产成人精品照片| 国产91露脸合集magnet | 国产精品一区二区在线播放| 日韩精品一区二区三区视频在线观看| 女人扒开双腿让男人捅| 中文字幕一区二区三区av| 少妇太紧太爽又黄又硬又爽小说| 六月婷婷色综合| 日韩写真欧美这视频| 欧美大喷水吹潮合集在线观看| 尤物视频一区二区| 在线观看免费亚洲| 99热国产精品| 亚洲欧美一区二区三区极速播放| 成人免费精品动漫网站| 国产99久久久国产精品 | 中文字幕人妻一区二区三区在线视频| 首页欧美精品中文字幕| 欧美一区二区三区在线观看| 国产成人av无码精品| 亚洲成人av电影在线| 欧美美女一区二区在线观看| 亚洲妇女无套内射精| 亚洲一区免费视频| 欧美日韩精品欧美日韩精品一综合| 91女厕偷拍女厕偷拍高清| 亚洲精品国产a久久久久久 | 久久久久久久穴| 亚洲一区在线观看网站| 欧美日韩国产经典色站一区二区三区| 日本xxxx免费| 亚洲大型综合色站| 欧美一区二区免费视频| 无码人妻精品一区二区三区温州| 人人狠狠综合久久亚洲| 精品久久久网站| 国产三级精品三级观看| 成人黄色一级视频| 有坂深雪av一区二区精品| 大桥未久恸哭の女教师| 亚洲福利电影网| 欧美一区二区三区四区久久| 六月婷婷七月丁香| 国产露脸91国语对白| 国产精品美女一区二区三区| 色欧美88888久久久久久影院| 97超碰欧美中文字幕| 亚洲福利视频一区二区| 日韩欧美成人午夜| 天天舔天天操天天干| 成人丝袜高跟foot| 一区二区三区美女| 日韩午夜在线观看| 久久一级免费视频| 99视频一区二区三区| 午夜私人影院久久久久| 日韩欧美中文字幕公布| 国产免费嫩草影院| 97精品超碰一区二区三区| 性久久久久久久| 久久青草欧美一区二区三区| 丰满少妇被猛烈进入一区二区| 免费观看黄网站| 免费成人在线播放| 国产精品美日韩| 69精品人人人人| 国产人与禽zoz0性伦| 久草福利在线观看| 麻豆专区一区二区三区四区五区| 中文字幕高清一区| 欧美酷刑日本凌虐凌虐| 日韩av片在线| 人妻互换一二三区激情视频| 久久99精品视频| 亚洲色大成网站www久久九九| 制服丝袜在线91| 三级黄色在线观看| 国产xxxx视频| 国产91富婆露脸刺激对白| 亚洲国产成人av网| 日本一区二区三区在线观看| 欧美日韩在线播| 美女av免费看| 中国xxxx性xxxx产国| 国产aⅴ精品一区二区三区色成熟| 性欧美大战久久久久久久久| 中文一区一区三区高中清不卡| 91精品国产综合久久久久久久| 久久成人小视频| 日本丰满少妇裸体自慰| 成人av网站免费观看| 老司机精品视频在线| 色综合天天做天天爱| 全黄一级裸体片| 性生交大片免费看l| 国产精品99精品久久免费| 五月综合激情日本mⅴ| 中文字幕人成不卡一区|