linux信號集測試工程:
#include <unistd.h>
#include <iostream>
#include <signal.h>
#include <sys/types.h>
#include <sys/syscall.h>
#define gettid() syscall(SYS_gettid)
#include <pthread.h>
int main()
{
//一 :信號集的概念:
//00000000000000000000000000000000
// 一共有60多個信號,運用了一個集合的概念來表示所有的信號,信號集中的每一個0都表示一個信號,信號來了的話,就置爲1,信號函數運行完畢就恢復爲0.
// linux 下使用 sigset_t結構類型來表示信號集.
// typedef struct {
// unsigned long sig[2];
// }
// 二: 信號相關函數
// a) sigemptyset(); 把信號集中的所有信號都清0,表示這60多個信號都沒有來.
// b) sigfillset(); 把信號集中的素有信號都設置爲1
// c) 用sigaddset(),sigdelset()就可以往信號集種增加/刪除信號.
// d) sigprocmask,sigmember
// 一個進程裏面會對應一個信號集,這個信號集用來記錄當前屏蔽(阻塞)了哪些信號.
// 如果我們把這個信號集中的某個信號位設置爲1,就表示屏蔽了同類信號,那麼同類信號就會被屏蔽,不能傳遞給進程
// 如果這個信號集種有很多個信號位被設置爲1,那麼這些所有被設置爲1的信號都是屬於當前被阻塞的而不能傳遞到該進程的信號.
// sigprocmask() 函數能夠設置該進程所對應的信號集中的內容.
sigset_t newMask,oldMask; // 信號集:直接和進程進行綁定.
//1.初始化信號集
sigemptyset(&newMask);
sigemptyset(&oldMask);
//2.設置信號集屏蔽哪些信號
sigaddset(&newMask,SIGTSTP);
//2.1 測試信號集有沒有屏蔽某個信號
if(sigismember(&newMask,SIGTSTP))
{
std::cout << "當前信號集已經屏蔽了 SIGTSTP 信號" << std::endl;
}
else
{
std::cout << "當前信號集沒有屏蔽 SIGTSTP 信號" << std::endl;
}
//3.將當前設置的信號集綁定到進程中來,oldMask爲進程以前的信號集.
sigprocmask(SIG_BLOCK,&newMask,&oldMask);
for(;;)
{
std::cout << "休息2秒" << std::endl;
sleep(2);
}
// 問題: 如何獲取當前進程的信號集?
}