//乙個程序,必須能夠記住 這個程序 當前阻塞了哪些訊號//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...