溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

sigsuspend函數(shù)有什么用

發(fā)布時(shí)間:2021-09-22 17:19:59 來(lái)源:億速云 閱讀:176 作者:小新 欄目:開發(fā)技術(shù)

這篇文章將為大家詳細(xì)講解有關(guān)sigsuspend函數(shù)有什么用,小編覺(jué)得挺實(shí)用的,因此分享給大家做個(gè)參考,希望大家閱讀完這篇文章后可以有所收獲。

  sigsuspend函數(shù)作用:如果在等待信號(hào)發(fā)生時(shí)希望去休眠,則使用sigsuspend函數(shù)是非常合適的。

  sigsuspend函數(shù)示例

  頭文件:#include<signal.h>

  一個(gè)保護(hù)臨界區(qū)代碼的錯(cuò)誤實(shí)例:(sigprocmask()和pause()實(shí)現(xiàn))

  #include<unistd.h>

  #include<signal.h>

  #include<stdio.h>

  voidhandler(intsig)//信號(hào)處理函數(shù)的實(shí)現(xiàn)

  {

  printf("SIGINTsig");

  }

  intmain()

  {

  sigset_tnew,old;

  structsigactionact;

  act.sa_handler=handler;//信號(hào)處理函數(shù)handler

  sigemptyset(&act.sa_mask);

  act.sa_flags=0;

  sigaction(SIGINT,&act,0);//準(zhǔn)備捕捉SIGINT信號(hào)

  sigemptyset(&new);

  sigaddset(&new,SIGINT);

  sigprocmask(SIG_BLOCK,&new,&old);//將SIGINT信號(hào)阻塞,同時(shí)保存當(dāng)前信號(hào)集

  printf("Blocked");

  sigprocmask(SIG_SETMASK,&old,NULL);//取消阻塞

  pause();

  return0;

  }

  上面實(shí)例的問(wèn)題是:本來(lái)期望pause()之后,來(lái)SIGINT信號(hào),可以結(jié)束程序;可是,如果當(dāng)“取消阻塞”和“pause”之間,正好來(lái)了SIGINT信號(hào),結(jié)果程序因?yàn)閜ause的原因會(huì)一直掛起。。

  sigsuspend函數(shù)問(wèn)題解決

  如果在信號(hào)阻塞時(shí)將其發(fā)送給進(jìn)程,那么該信號(hào)的傳遞就被推遲直到對(duì)它解除了阻塞。對(duì)應(yīng)用程序而言,該信號(hào)好像發(fā)生在解除對(duì)SIGINT的阻塞和pause之間。如果發(fā)生了這種情況,或者如果在解除阻塞時(shí)刻和pause之間確實(shí)發(fā)生了信號(hào),那么就產(chǎn)生了問(wèn)題。因?yàn)槲覀兛赡懿粫?huì)再見到該信號(hào),所以從這種意義上而言,在此時(shí)間窗口(解除阻塞和pause之間)中發(fā)生的信號(hào)丟失了,這樣就使pause永遠(yuǎn)阻塞。

  為了糾正此問(wèn)題,需要在一個(gè)原子操作中先恢復(fù)信號(hào)屏蔽字,然后使進(jìn)程休眠。這種功能是由sigsuspend函數(shù)提供的。

  #include<signal.h>

  intsigsuspend(constsigset_t*sigmask);

  返回值:-1,并將errno設(shè)置為EINTR

  將進(jìn)程的信號(hào)屏蔽字設(shè)置為由sigmask指向的值。在捕捉到一個(gè)信號(hào)或發(fā)生了一個(gè)會(huì)終止該進(jìn)程的信號(hào)之前,該進(jìn)程被掛起。如果捕捉到一個(gè)信號(hào)而且從該信號(hào)處理程序返回,則sigsuspend返回,并且將該進(jìn)程的信號(hào)屏蔽字設(shè)置為調(diào)用sigsuspend之前的值。

  注意,此函數(shù)沒(méi)有成功返回值。如果它返回到調(diào)用者,則總是返回-1,并將errno設(shè)置為EINTR(表示一個(gè)被中斷的系統(tǒng)調(diào)用)。

關(guān)于“sigsuspend函數(shù)有什么用”這篇文章就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,使各位可以學(xué)到更多知識(shí),如果覺(jué)得文章不錯(cuò),請(qǐng)把它分享出去讓更多的人看到。

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI