您好,登錄后才能下訂單哦!
信號是一種軟中斷,用于通過異步的方式對進程進行事件通知。信號分為實時信號和非實時信號,各個進程對于信號的處理方式不一,處理方式分為三類:忽略,捕捉,執行系統默認動作。進程可以選擇屏蔽某個或某些信號。
SylixOS可以通過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:將新的信號集賦值給當前信號屏蔽字
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-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所示。
圖 2-1 測試代碼的運行結果
若發送無法被屏蔽的信號,則會執行與信號相關聯的處理動作。
《SylixOS應用開發手冊》
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。