色婷婷AⅤ一区二区三区|亚洲精品第一国产综合亚AV|久久精品官方网视频|日本28视频香蕉

          新聞中心

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

          進(jìn)程間通信之:信號

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

          本文引用地址:http://cafeforensic.com/article/257126.htm

          表8.15列舉了sigprocmask的語法要點(diǎn)。

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

          所需頭文件

          #includesignal.h>

          函數(shù)原型

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

          函數(shù)傳入值

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

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

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

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

          set:指定信號集

          oset:信號屏蔽字

          函數(shù)返回值

          成功:0

          出錯:-1

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

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

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

          所需頭文件

          #includesignal.h>

          函數(shù)原型

          intsigpending(sigset_t*set)

          函數(shù)傳入值

          set:要檢測的信號集

          函數(shù)返回值

          成功:0

          出錯:-1

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

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

          (3)使用實(shí)例。

          該實(shí)例首先把SIGQUIT、SIGINT兩個信號加入信號集,然后將該信號集合設(shè)為阻塞狀態(tài),并進(jìn)入用戶輸入狀態(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中的信號不會被傳遞給進(jìn)程,暫時進(jìn)入待處理狀態(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)閉