91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

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

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

SylixOS的信號屏蔽淺析

發布時間:2020-07-16 03:44:38 來源:網絡 閱讀:510 作者:qq58f47049ce44d 欄目:開發技術

1.信號介紹

   信號是一種軟中斷,用于通過異步的方式對進程進行事件通知。信號分為實時信號和非實時信號,各個進程對于信號的處理方式不一,處理方式分為三類:忽略,捕捉,執行系統默認動作。進程可以選擇屏蔽某個或某些信號。

2.信號屏蔽

   SylixOS可以通過sigprocmask函數對某個信號集內的信號進行屏蔽。在信號被屏蔽的期間,進程對所屏蔽的大部分信號不會進行響應,只有解除屏蔽后才會響應。

2.1 sigprocmask函數

   sigprocmask函數原型如程序清單 2-1所示。

程序清單 2-1  sigprocmask函數原型

#include<signal.h>

int sigprocmask (intiCmd,constsigset_t *psigset,sigset_t *psigsetOld);

   函數sigprocmask原型分析:

   1、此函數成功時返回0,失敗時返回-1并設置錯誤號;

   2、參數 iCmd是信號集命令;

   3、參數 psigset是新的信號集;

   4、輸出參數 psigsetOld保存先前的信號集。

   sigprocmask設置信號屏蔽字時iCmd對應3個命令:

   1、SIG_BLOCK:新的信號集以或的形式添加到當前的信號屏蔽字中

   2、SIG_UNBLOCK:從當前的信號屏蔽字中刪除新的信號集中包含的信號

   3、SIG_SETMASK:將新的信號集賦值給當前信號屏蔽字

2.1 sigprocmask函數

   SylixOS可以通過四個函數對信號集進行操作,具體函數如程序清單 2-2所示。

程序清單 2-2  信號集操作函數

#include<signal.h>

int sigemptyset (sigset_t *psigset);

int sigfillset (sigset_t *psigset);

int sigaddset (sigset_t *psigset,intiSigNo);

int sigdelset (sigset_t *psigset,intiSigNo);

   1、sigemptyset函數用于初始化一個信號集,使其不包含任何信號;

   2、sigfillset用于初始化一個信號集,使其包含所有信號;

   3、sigaddset用于向一個信號集中添加某個信號;

   4、sigdelset用于從一個信號集中刪除某個信號。

   SylixOS可以設置進程屏蔽任意的信號,但是某些信號即使被設置屏蔽也無法生效,無法被屏蔽的信號如表 2-1所示。

表 2-1  無法屏蔽的信號

信號名

信號描述

SIGKILL

強迫進程結束

SIGABRT

異常結束

SIGSTOP

停止進程執行

SIGFPE

協處理器出錯

SIGILL

非法指令

SIGBUS

bus error

SIGSEGV

無效內存引用

2.1 信號屏蔽測試

   設置進程屏蔽所有的信號后,向進程發送任意的信號,可以查看到信號是否被屏蔽,具體的信號屏蔽測試代碼如程序清單 2-3所示。

程序清單 2-3  信號屏蔽測試代碼

#include<stdio.h>

#include<signal.h>

 

int  main (int argc,char  **argv)

{

    int      iSigNo;              /*  信號ID                      */

    sigset_t  newMask;           /*  新的信號集                  */

    sigset_t  oldMask;            /*  舊的信號集                  */

    sigset_t  pendMask;          /*  阻塞的信號集                */

 

    sigfillset(&newMask);          /* 信號集包含所有信號          */

   

/*

     *  設置新的信號掩碼,并保存舊的信號掩碼

     */

    if (sigprocmask(SIG_SETMASK, &newMask, &oldMask) < 0) {

        fprintf(stderr,"Sigprocmask error.\n");

        return  (PX_ERROR);

    }

 

    sleep(5);                    /* 休眠等待信號                */

 

    sigpending(&pendMask);       /* 獲取未決的信號集            */

    /*

     *  打印出未決信號集中的信號

     */

    for (iSigNo =SIGHUP;iSigNo <=SIGRTMAX;iSigNo++)

    {

        if (sigismember(&pendMask,iSigNo) ==TRUE) {

            fprintf(stdout,"Signal %d pending.\n",iSigNo);

        }

    }

 

    /*

     *  恢復舊的信號掩碼

     */

    if (sigprocmask(SIG_SETMASK, &oldMask,NULL) < 0) {

      fprintf(stderr,"resume mask error.\n");

      return  (PX_ERROR);

    }

 

    return  (ERROR_NONE);

}

   運行代碼后,可以通過kill命令向進程發送除表 2-1以外的任意的信號后,信號無法被響應,運行結果具體如圖 2-1所示。

SylixOS的信號屏蔽淺析

圖 2-1  測試代碼的運行結果

   若發送無法被屏蔽的信號,則會執行與信號相關聯的處理動作。

3.參考資料

   《SylixOS應用開發手冊》


向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

鹿邑县| 南溪县| 日照市| 焦作市| 宁阳县| 鲜城| 兴宁市| 荥阳市| 德阳市| 鸡泽县| 海口市| 杂多县| 泰兴市| 普兰县| 莎车县| 浙江省| 昌乐县| 扎兰屯市| 辉县市| 辰溪县| 大悟县| 兴文县| 通城县| 余干县| 靖安县| 长岛县| 隆化县| 雅江县| 安阳市| 温泉县| 竹溪县| 霍林郭勒市| 德州市| 乐亭县| 平遥县| 资源县| 浦城县| 东辽县| 靖远县| 东兴市| 雅江县|