日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

打印未决信号集

發布時間:2023/11/30 编程问答 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 打印未决信号集 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

信號集操作函數

內核通過讀取未決信號集來判斷信號是否應被處理。信號屏蔽字mask可以影響未決信號集。而我們可以在應用程序中自定義set來改變mask。已達到屏蔽指定信號的目的。

信號集設定

?????? sigset_t? set;??????? // typedef unsigned long sigset_t;

int sigemptyset(sigset_t *set);?????????????????? 將某個信號集清0?????? ???? ???? 成功:0;失敗:-1

??? int sigfillset(sigset_t *set);?????????????????? ?????? 將某個信號集置1?????? ? ?? ???? 成功:0;失敗:-1

??? int sigaddset(sigset_t *set, int signum);???? ?????? 將某個信號加入信號集? ?? ?????? 成功:0;失敗:-1

??? int sigdelset(sigset_t *set, int signum);?????? ?????? 將某個信號清出信號集?? ? ?????? 成功:0;失敗:-1

??? int sigismember(const sigset_t *set, int signum);判斷某個信號是否在信號集中? 返回值:在集合:1;不在:0;出錯:-1?

??? sigset_t類型的本質是位圖。但不應該直接使用位操作,而應該使用上述函數,保證跨系統操作有效。

??? 對比認知select 函數。

sigprocmask函數

用來屏蔽信號、解除屏蔽也使用該函數。其本質,讀取或修改進程的信號屏蔽字(PCB中)

??? 嚴格注意,屏蔽信號:只是將信號處理延后執行(延至解除屏蔽);而忽略表示將信號丟處理。

int sigprocmask(int how, const sigset_t *set, sigset_t *oldset); 成功:0;失敗:-1,設置errno

參數:

?????? ?????? set:傳入參數,是一個位圖,set中哪位置1,就表示當前進程屏蔽哪個信號。

?????? ?????? oldset:傳出參數,保存舊的信號屏蔽集。

?????? ?????? how參數取值:?? 假設當前的信號屏蔽字為mask

  • SIG_BLOCK: 當how設置為此值,set表示需要屏蔽的信號。相當于 mask = mask|set
  • SIG_UNBLOCK: 當how設置為此,set表示需要解除屏蔽的信號。相當于 mask = mask & ~set
  • SIG_SETMASK: 當how設置為此,set表示用于替代原始屏蔽及的新屏蔽集。相當于 mask = set若,調用sigprocmask解除了對當前若干個信號的阻塞,則在sigprocmask返回前,至少將其中一個信號遞達。
  • sigpending函數

    讀取當前進程的未決信號集

    int sigpending(sigset_t *set);?????? set傳出參數。?? 返回值:成功:0;失敗:-1,設置errno

    練習:編寫程序。把所有常規信號的未決狀態打印至屏幕。????? ????????????? ?????? 【sigpending.c】

    /*** printped.c ***/ #include<stdio.h> #include<unistd.h> #include<signal.h>void printped(sigset_t *ped) {int i;for(i = 1; i < 32; i++){if(sigismember(ped,i)){putchar('1');}else {putchar('0');}}printf("\n"); }int main() {sigset_t myset,oldset,ped;sigemptyset(&myset);sigaddset(&myset,SIGQUIT);sigprocmask(SIG_BLOCK,&myset,&oldset);while(1){sigpending(&ped);printped(&ped);sleep(1);}return 0; }

    ?

    轉載于:https://www.cnblogs.com/wanghao-boke/p/11333266.html

    總結

    以上是生活随笔為你收集整理的打印未决信号集的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。