這篇文章將為大家詳細講解有關sigsuspend函數有什么用,小編覺得挺實用的,因此分享給大家做個參考,希望大家閱讀完這篇文章后可以有所收獲。
讓客戶滿意是我們工作的目標,不斷超越客戶的期望值來自于我們對這個行業的熱愛。我們立志把好的技術通過有效、簡單的方式提供給客戶,將通過不懈努力成為客戶在信息化領域值得信任、有價值的長期合作伙伴,公司提供的服務項目有:國際域名空間、網站空間、營銷軟件、網站建設、全州網站維護、網站推廣。sigsuspend函數作用:如果在等待信號發生時希望去休眠,則使用sigsuspend函數是非常合適的。
sigsuspend函數示例
頭文件:#include<signal.h>
一個保護臨界區代碼的錯誤實例:(sigprocmask()和pause()實現)
#include<unistd.h>
#include<signal.h>
#include<stdio.h>
voidhandler(intsig)//信號處理函數的實現
{
printf("SIGINTsig");
}
intmain()
{
sigset_tnew,old;
structsigactionact;
act.sa_handler=handler;//信號處理函數handler
sigemptyset(&act.sa_mask);
act.sa_flags=0;
sigaction(SIGINT,&act,0);//準備捕捉SIGINT信號
sigemptyset(&new);
sigaddset(&new,SIGINT);
sigprocmask(SIG_BLOCK,&new,&old);//將SIGINT信號阻塞,同時保存當前信號集
printf("Blocked");
sigprocmask(SIG_SETMASK,&old,NULL);//取消阻塞
pause();
return0;
}
上面實例的問題是:本來期望pause()之后,來SIGINT信號,可以結束程序;可是,如果當“取消阻塞”和“pause”之間,正好來了SIGINT信號,結果程序因為pause的原因會一直掛起。。
sigsuspend函數問題解決
如果在信號阻塞時將其發送給進程,那么該信號的傳遞就被推遲直到對它解除了阻塞。對應用程序而言,該信號好像發生在解除對SIGINT的阻塞和pause之間。如果發生了這種情況,或者如果在解除阻塞時刻和pause之間確實發生了信號,那么就產生了問題。因為我們可能不會再見到該信號,所以從這種意義上而言,在此時間窗口(解除阻塞和pause之間)中發生的信號丟失了,這樣就使pause永遠阻塞。
為了糾正此問題,需要在一個原子操作中先恢復信號屏蔽字,然后使進程休眠。這種功能是由sigsuspend函數提供的。
#include<signal.h>
intsigsuspend(constsigset_t*sigmask);
返回值:-1,并將errno設置為EINTR
將進程的信號屏蔽字設置為由sigmask指向的值。在捕捉到一個信號或發生了一個會終止該進程的信號之前,該進程被掛起。如果捕捉到一個信號而且從該信號處理程序返回,則sigsuspend返回,并且將該進程的信號屏蔽字設置為調用sigsuspend之前的值。
注意,此函數沒有成功返回值。如果它返回到調用者,則總是返回-1,并將errno設置為EINTR(表示一個被中斷的系統調用)。
關于“sigsuspend函數有什么用”這篇文章就分享到這里了,希望以上內容可以對大家有一定的幫助,使各位可以學到更多知識,如果覺得文章不錯,請把它分享出去讓更多的人看到。
當前題目:sigsuspend函數有什么用-創新互聯
轉載來源:http://vcdvsql.cn/article22/cseejc.html
成都網站建設公司_創新互聯,為您提供響應式網站、網站導航、ChatGPT、建站公司、做網站、營銷型網站建設
聲明:本網站發布的內容(圖片、視頻和文字)以用戶投稿、用戶轉載內容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網站立場,如需處理請聯系客服。電話:028-86922220;郵箱:631063699@qq.com。內容未經允許不得轉載,或轉載時需注明來源: 創新互聯