校园春色亚洲色图_亚洲视频分类_中文字幕精品一区二区精品_麻豆一区区三区四区产品精品蜜桃

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

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

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

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

sleep:

普通版本

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

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

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

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

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

   6> 切換到用戶態(tài)執(zhí)行sig_alrm函數(shù),進(jìn)⼊sig_alrm函數(shù)時SIGALRM信號被⾃動屏蔽,從sig_alrm函數(shù)返回SIGALRM信 號⾃動解除屏蔽。然后⾃動執(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信號以前的處理動作。

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

sigaction函數(shù)

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

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

int sigemptyset(sigset_t *set); 

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

二、優(yōu)化版本

所需函數(shù)分析

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

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

sigprocmask

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

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

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

how的選項意義


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

代碼實現(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)化版本解決了普通版本存在的競態(tài)問題。我們重新審視一下普通版本的時序問題。

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

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

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

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

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

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

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

在一個進(jìn)程運行過程中,因為由于異步,所以可能被其他優(yōu)先級更高的進(jìn)程,由于時序問題而引發(fā)的錯誤問題。這樣的問題稱為競態(tài)問題。

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

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

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

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

巨人網(wǎng)絡(luò)通訊聲明:本文標(biāo)題《linux 下實現(xiàn)sleep詳解及簡單實例》,本文關(guān)鍵詞  linux,下,實現(xiàn),sleep,詳解,;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問題,煩請?zhí)峁┫嚓P(guān)信息告之我們,我們將及時溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無關(guān)。
  • 相關(guān)文章
  • 下面列出與本文章《linux 下實現(xiàn)sleep詳解及簡單實例》相關(guān)的同類信息!
  • 本頁收集關(guān)于linux 下實現(xiàn)sleep詳解及簡單實例的相關(guān)信息資訊供網(wǎng)民參考!
  • 推薦文章
    校园春色亚洲色图_亚洲视频分类_中文字幕精品一区二区精品_麻豆一区区三区四区产品精品蜜桃
    成人va在线观看| 国产米奇在线777精品观看| 国产精品三级av在线播放| 久久精品夜夜夜夜久久| 亚洲一区二区三区国产| 久久精品噜噜噜成人av农村| 欧美色图片你懂的| 精品1区2区在线观看| 亚洲精品久久久蜜桃| 久久99这里只有精品| 91福利国产精品| 国产三级久久久| 奇米色777欧美一区二区| 97se亚洲国产综合在线| 久久网这里都是精品| 日韩在线播放一区二区| 91免费视频观看| 国产亚洲午夜高清国产拍精品| 视频在线观看91| 色婷婷综合中文久久一本| 国产三级三级三级精品8ⅰ区| 亚洲国产精品一区二区www在线| 东方aⅴ免费观看久久av| 日韩欧美一卡二卡| 日韩在线卡一卡二| 欧美肥大bbwbbw高潮| 亚洲一区日韩精品中文字幕| av在线一区二区三区| 日韩免费性生活视频播放| 亚洲一区二区在线视频| 91丨porny丨户外露出| 国产精品欧美经典| 成人精品国产免费网站| 久久久国产精品麻豆| 精久久久久久久久久久| 日韩精品一区二| 老司机免费视频一区二区 | 日韩一区二区三区高清免费看看| 亚洲乱码中文字幕综合| 一本色道久久综合亚洲aⅴ蜜桃| 国产精品久久久久一区二区三区共| 国产麻豆精品视频| 2021国产精品久久精品| 久久99深爱久久99精品| www日韩大片| 国产成人av电影在线| 国产精品视频你懂的| 成人一区二区三区在线观看| 国产精品美女久久久久aⅴ| 在线不卡一区二区| 中文在线一区二区| 国产99久久久国产精品| 久久久99精品免费观看不卡| 久久精品国产成人一区二区三区 | 久久久无码精品亚洲日韩按摩| 日韩av二区在线播放| 日韩视频免费观看高清完整版在线观看 | 亚洲欧美日韩一区二区三区在线观看| 国产成人小视频| 国产精品久久精品日日| 99精品国产91久久久久久| 亚洲综合色噜噜狠狠| 91精品国产综合久久久蜜臀图片| 麻豆视频观看网址久久| 久久久久免费观看| 99久精品国产| 午夜电影久久久| 2019国产精品| 91蜜桃在线观看| 日本欧美大码aⅴ在线播放| 久久只精品国产| 色偷偷久久一区二区三区| 婷婷中文字幕综合| 国产偷国产偷亚洲高清人白洁| 色综合色综合色综合色综合色综合| 亚洲成人av中文| 久久精品视频在线看| 一本大道久久a久久精二百| 日本成人在线不卡视频| 国产精品国产a| 91精品国产综合久久小美女| 国产成人鲁色资源国产91色综 | 蜜桃久久久久久| 亚洲欧洲精品天堂一级| 欧美日韩在线一区二区| 国产麻豆视频一区| 午夜精品久久久久久久久久久| 国产午夜亚洲精品不卡| 欧美日韩国产一级| 成人av电影在线| 国内成人免费视频| 日韩精品视频网站| 尤物av一区二区| 国产精品久久影院| 日韩精品一区二区在线| 欧美中文字幕久久| 成人免费高清在线观看| 六月丁香综合在线视频| 亚洲黄色小视频| 中文字幕欧美日本乱码一线二线| 91精品欧美福利在线观看| 色素色在线综合| 成人av在线播放网址| 国产一区美女在线| 免费人成在线不卡| 爽爽淫人综合网网站| 亚洲综合图片区| 亚洲三级在线看| 中文字幕中文字幕一区| 国产欧美va欧美不卡在线| 精品久久五月天| 日韩精品一区二区三区三区免费| 欧美日韩不卡一区二区| 日本国产一区二区| 91视频在线观看免费| a4yy欧美一区二区三区| 成人毛片老司机大片| 国产电影一区二区三区| 国产在线不卡一区| 精品一二三四区| 国产最新精品免费| 国产在线精品一区二区夜色| 另类中文字幕网| 国产麻豆精品视频| 成人性生交大片免费看中文| 成人性生交大合| 播五月开心婷婷综合| aaa欧美大片| 在线观看三级视频欧美| 在线免费观看日本欧美| 欧美日韩精品高清| 欧美一区二区三区视频免费播放 | 麻豆传媒一区二区三区| 日本系列欧美系列| 精品一区二区三区的国产在线播放| 麻豆成人91精品二区三区| 久久er精品视频| 国产美女视频91| 成人av电影免费在线播放| 日本高清不卡在线观看| 欧美视频一区二区三区| 欧美精品一卡两卡| 欧美一区二区三区的| 日韩区在线观看| 久久免费电影网| 国产精品成人在线观看| 一区二区三区四区国产精品| 亚洲香肠在线观看| 日本麻豆一区二区三区视频| 九九国产精品视频| 岛国精品一区二区| 色视频欧美一区二区三区| 欧美日韩精品一区二区在线播放| 91精品国产高清一区二区三区| 精品久久一区二区| 亚洲色图视频网| 婷婷久久综合九色国产成人| 韩国欧美国产1区| 97se亚洲国产综合自在线观| 欧美一区二区三区电影| 国产视频一区二区三区在线观看| 专区另类欧美日韩| 日本亚洲天堂网| 不卡av在线网| 日韩午夜小视频| 综合色天天鬼久久鬼色| 日韩在线播放一区二区| 国产成人超碰人人澡人人澡| 91官网在线免费观看| 精品欧美乱码久久久久久1区2区| 国产精品视频在线看| 日韩国产精品久久| caoporn国产精品| 欧美一区二区在线免费观看| 欧美极品xxx| 日韩va亚洲va欧美va久久| 波多野结衣视频一区| 日韩欧美国产综合| 亚洲精品欧美激情| 国产伦精品一区二区三区在线观看 | 欧美一区二区三区四区在线观看| 国产精品色噜噜| 精品制服美女久久| 欧美三级日韩在线| 国产精品麻豆一区二区| 久热成人在线视频| 欧美色图天堂网| 亚洲视频在线一区| 国产精品夜夜嗨| 日韩一区二区三区在线观看| 亚洲精品乱码久久久久久黑人| 激情小说欧美图片| 91精品在线免费| 亚洲国产精品综合小说图片区| 大桥未久av一区二区三区中文| 日韩欧美中文字幕公布| 一区二区三区在线高清| 成人黄色一级视频| 欧美一区二区免费视频| 亚洲精品视频一区|