新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > 進程間通信之:信號

        進程間通信之:信號

        作者: 時間:2013-09-13 來源:網絡 收藏

        本文引用地址:http://www.104case.com/article/257126.htm

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

        表8.15 sigprocmask函數語法要點

        所需頭文件

        #includesignal.h>

        函數原型

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

        函數傳入值

        how:決定函數的操作方式

        SIG_BLOCK:增加一個集合到當前進程的阻塞集合之中

        SIG_UNBLOCK:從當前的阻塞集合之中刪除一個集合

        SIG_SETMASK:將當前的集合設置為信號阻塞集合

        set:指定信號集

        oset:信號屏蔽字

        函數返回值

        成功:0

        出錯:-1

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

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

        表8.16 sigpending函數語法要點

        所需頭文件

        #includesignal.h>

        函數原型

        intsigpending(sigset_t*set)

        函數傳入值

        set:要檢測的信號集

        函數返回值

        成功:0

        出錯:-1

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

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

        (3)使用實例。

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

        /*sigset.c*/

        #includesys/types.h>

        #includeunistd.h>

        #includesignal.h>

        #includestdio.h>

        #includestdlib.h>

        /*自定義的信號處理函數*/

        voidmy_func(intsignum)

        {

        printf(Ifyouwanttoquit,pleasetrySIGQUITn);

        }

        intmain()

        {

        sigset_tset,pendset;

        structsigactionaction1,action2;

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

        if(sigemptyset(set)0)

        {

        perror(sigemptyset);

        exit(1);

        }

        /*將相應的信號加入信號集*/

        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);

        }

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

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

        {

        perror(sigprocmask);

        exit(1);

        }

        else

        {

        printf(Signalsetwasblocked,Pressanykey!);

        getchar();

        }

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

        模擬信號相關文章:什么是模擬信號


        linux相關文章:linux教程


        數字通信相關文章:數字通信原理


        通信相關文章:通信原理




        評論


        相關推薦

        技術專區

        關閉
        主站蜘蛛池模板: 三明市| 中方县| 永泰县| 达日县| 黄山市| 冕宁县| 灌南县| 株洲市| 论坛| 陈巴尔虎旗| 屏山县| 潼南县| 双流县| 库尔勒市| 贡山| 体育| 福海县| 米脂县| 蒲城县| 鄂温| 湾仔区| 白银市| 石景山区| 南木林县| 湛江市| 秦皇岛市| 陇川县| 京山县| 祁连县| 正阳县| 白河县| 青浦区| 双桥区| 军事| 青田县| 漳浦县| 河池市| 红桥区| 开鲁县| 洮南市| 克什克腾旗|