(2 4)訊號程式設計高階 sigprocmask範例

2021-09-12 07:49:13 字數 2212 閱讀 2652

//乙個程序,必須能夠記住 這個程序 當前阻塞了哪些訊號

//000000000000000000000

//我們需要 「訊號集 」的這麼一種資料型別(結構),能夠把這60多個訊號都表示下(都裝下)。

//0000000000,0000000000,0000000000,00,0000000000,0000000000,0000000000,00 (64個二進位制位)

//linux 是用sigset_t結構型別來表示訊號集的;

//typedef structsigset_t

//訊號集的定義:訊號集表示一組訊號的來(1)或者沒來(0)

//a)sigemtpyset():把訊號集中的所有訊號都清0,表示這60多個訊號都沒有來;

//00000000000000000000000000.....

//b)sigfillset();把訊號集中的所有訊號都設定為1,跟sigemptyset()正好相反;

//11111111111111111111111111.....

//c)用sigaddset(),sigdelset()就可以往訊號集中增加訊號,或者從訊號集中刪除特定訊號;

//d)sigprocmask,sigmember

//乙個程序,裡邊會有乙個訊號集,用來記錄當前遮蔽(阻塞)了哪些訊號;

//如果我們把這個訊號集中的某個訊號位設定為1,就表示遮蔽了同類訊號,此時再來個同類訊號,那麼同類訊號會被遮蔽,不能傳遞給程序;

//如果這個訊號集中有很多個訊號位都被設定為1,那麼所有這些被設定為1的訊號都是屬於當前被阻塞的而不能傳遞到該程序的訊號;

//sigprocmask()函式,就能夠設定該程序所對應的訊號集中的內容;

//sleep()函式能夠被打斷:

//(1)時間到達了;

//(2)來了某個訊號,使sleep()提前結束,此時sleep會返回乙個值,這個值就是未睡夠的時間;

//sigaction()函式;

#include #include //malloc

#include #include //訊號處理函式

void sig_quit(int signo)

}int main(int argc, char *const *ar**)

sigemptyset(&newmask); //newmask訊號集中所有訊號都清0(表示這些訊號都沒有來);

sigaddset(&newmask,sigquit); //設定newmask訊號集中的sigquit訊號位為1,說白了,再來sigquit訊號時,程序就收不到,設定為1就是該訊號被阻塞掉唄

//sigprocmask():設定該程序所對應的訊號集

if(sigprocmask(sig_block,&newmask,&oldmask) < 0) //第乙個引數用了sig_block表明設定 程序 新的訊號遮蔽字 為 「當前訊號遮蔽字 和 第二個引數指向的訊號集的並集

printf("我要開始休息10秒了--------begin--,此時我無法接收sigquit訊號!\n");

sleep(10); //這個期間無法收到sigquit訊號的;

printf("我已經休息了10秒了--------end----!\n");

if(sigismember(&newmask,sigquit)) //測試乙個指定的訊號位是否被置位(為1),測試的是newmask

else

if(sigismember(&newmask,sighup)) //測試另外乙個指定的訊號位是否被置位,測試的是newmask

else

//現在我要取消對sigquit訊號的遮蔽(阻塞)--把訊號集還原回去

if(sigprocmask(sig_setmask,&oldmask,null) < 0) //第乙個引數用了sigsetmask表明設定 程序 新的訊號遮蔽字為 第二個引數 指向的訊號集,第三個引數沒用

printf("sigprocmask(sig_setmask)成功!\n");

if(sigismember(&oldmask,sigquit)) //測試乙個指定的訊號位是否被置位,這裡測試的當然是oldmask

else

}printf("再見了!\n");

return 0;

}

unix環境高階程式設計 訊號(2)

函式kill和raise kill函式將訊號傳送給程序或程序組,raise函式則執行程序向自身傳送訊號。kill的pid引數有以下四種不同情況 pid 0,將該訊號傳送給程序id為pid的程序 pid 0,將該訊號傳送給與傳送程序屬於同一程序組的所有程序。pid 0 將該訊號傳送給程序組id等於pi...

Unix環境高階程式設計 九 訊號

訊號時軟中斷,很多比較重要的應用程式都需要處理訊號,訊號提供了一種處理非同步事件的方法。每個訊號都乙個名字,以sig開頭,在標頭檔案中定義訊號型別,都是正整數 訊號編號 產生訊號的條件 1 當使用者按某些終端鍵時,引發終端產生的訊號。2 硬體異常產生訊號。3 程序呼叫kill函式將訊號傳送給另外乙個...

《unix高階環境程式設計》訊號 訊號傳送與捕獲

kill 函式是將訊號傳送給程序或程序組,raise 函式是將訊號傳送給自身,他們定義及說明如下所示 cpp view plain copy 訊號傳送與捕獲 函式功能 將訊號傳送給程序或程序組 返回值 若成功則返回0,若出錯則返回 1 函式原型 include intkill pid t pid,i...