linux 信號集測試範列

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);
    }
    

    // 問題: 如何獲取當前進程的信號集?



}

在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章