<meter id="pryje"><nav id="pryje"><delect id="pryje"></delect></nav></meter>
          <label id="pryje"></label>

          新聞中心

          EEPW首頁 > 嵌入式系統(tǒng) > 設(shè)計應(yīng)用 > 進程間通信之:信號

          進程間通信之:信號

          作者: 時間:2013-09-13 來源:網(wǎng)絡(luò) 收藏

          本文引用地址:http://www.ex-cimer.com/article/257126.htm

          表8.15列舉了sigprocmask的語法要點。

          表8.15 sigprocmask函數(shù)語法要點

          所需頭文件

          #includesignal.h>

          函數(shù)原型

          intsigprocmask(inthow,constsigset_t*set,sigset_t*oset)

          函數(shù)傳入值

          how:決定函數(shù)的操作方式

          SIG_BLOCK:增加一個集合到當(dāng)前進程的阻塞集合之中

          SIG_UNBLOCK:從當(dāng)前的阻塞集合之中刪除一個集合

          SIG_SETMASK:將當(dāng)前的集合設(shè)置為信號阻塞集合

          set:指定信號集

          oset:信號屏蔽字

          函數(shù)返回值

          成功:0

          出錯:-1

          此處,若set是一個非空指針,則參數(shù)how表示函數(shù)的操作方式;若how為空,則表示忽略此操作。

          最后,表8.16列舉了sigpending函數(shù)的語法要點。

          表8.16 sigpending函數(shù)語法要點

          所需頭文件

          #includesignal.h>

          函數(shù)原型

          intsigpending(sigset_t*set)

          函數(shù)傳入值

          set:要檢測的信號集

          函數(shù)返回值

          成功:0

          出錯:-1

          總之,在處理信號時,一般遵循如圖8.7所示的操作流程。

          圖8.7一般的信號操作處理流程

          (3)使用實例。

          該實例首先把SIGQUIT、SIGINT兩個信號加入信號集,然后將該信號集合設(shè)為阻塞狀態(tài),并進入用戶輸入狀態(tài)。用戶只需按任意鍵,就可以立刻將信號集合設(shè)置為非阻塞狀態(tài),再對這兩個信號分別操作,其中SIGQUIT執(zhí)行默認(rèn)操作,而SIGINT執(zhí)行用戶自定義函數(shù)的操作。源代碼如下所示:

          /*sigset.c*/

          #includesys/types.h>

          #includeunistd.h>

          #includesignal.h>

          #includestdio.h>

          #includestdlib.h>

          /*自定義的信號處理函數(shù)*/

          voidmy_func(intsignum)

          {

          printf(Ifyouwanttoquit,pleasetrySIGQUITn);

          }

          intmain()

          {

          sigset_tset,pendset;

          structsigactionaction1,action2;

          /*初始化信號集為空*/

          if(sigemptyset(set)0)

          {

          perror(sigemptyset);

          exit(1);

          }

          /*將相應(yīng)的信號加入信號集*/

          if(sigaddset(set,SIGQUIT)0)

          {

          perror(sigaddset);

          exit(1);

          }

          if(sigaddset(set,SIGINT)0)

          {

          perror(sigaddset);

          exit(1);

          }

          if(sigismember(set,SIGINT))

          {

          sigemptyset(action1.sa_mask);

          action1.sa_handler=my_func;

          action1.sa_flags=0;

          sigaction(SIGINT,action1,NULL);

          }

          if(sigismember(set,SIGQUIT))

          {

          sigemptyset(action2.sa_mask);

          action2.sa_handler=SIG_DFL;

          action2.sa_flags=0;

          sigaction(SIGQUIT,action2,NULL);

          }

          /*設(shè)置信號集屏蔽字,此時set中的信號不會被傳遞給進程,暫時進入待處理狀態(tài)*/

          if(sigprocmask(SIG_BLOCK,set,NULL)0)

          {

          perror(sigprocmask);

          exit(1);

          }

          else

          {

          printf(Signalsetwasblocked,Pressanykey!);

          getchar();

          }

          linux操作系統(tǒng)文章專題:linux操作系統(tǒng)詳解(linux不再難懂)

          模擬信號相關(guān)文章:什么是模擬信號


          linux相關(guān)文章:linux教程


          數(shù)字通信相關(guān)文章:數(shù)字通信原理


          通信相關(guān)文章:通信原理




          評論


          相關(guān)推薦

          技術(shù)專區(qū)

          關(guān)閉
          看屁屁www成人影院,亚洲人妻成人图片,亚洲精品成人午夜在线,日韩在线 欧美成人 (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })();