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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > linux >内容正文

linux

_Linux系统编程—信号集操作函数

發布時間:2025/3/19 linux 41 豆豆
生活随笔 收集整理的這篇文章主要介紹了 _Linux系统编程—信号集操作函数 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

先來回顧一下未決信號集是怎么回事。

信號從產生到抵達目的地,叫作信號遞達。而信號從產生到遞達的中間狀態,叫作信號的未決狀態。產生未決狀態的原因有可能是信號受到阻塞了,也就是信號屏蔽字(或稱阻塞信號集,mask)對應位被置1。阻塞信號集和未決信號集均是由內核維護的,整個過程如下圖示:

我們有時需要屏蔽某個信號,就需要去修改阻塞信號集。那么,我們該如何修改阻塞信號集?系統提供的一個方法是,我們先創建一個跟阻塞信號集一樣的集合,再利用它去修改阻塞信號集。

系統提供了一系列的信號集設定函數。這些函數如下所示:

sigset_t??set;?信號集數據類型,本質是typedef?unsigned?long?sigset_t;??int?sigemptyset(sigset_t?*set);?將某個信號集清0?int?sigfillset(sigset_t?*set);?將某個信號集置1?int?sigaddset(sigset_t?*set,?int?signum);?將某個信號加入信號集int?sigdelset(sigset_t?*set,?int?signum);?將某個信號清出信號集以上幾個函數返回值均是:成功:0;失敗:-1?int?sigismember(const?sigset_t?*set,?int?signum);?判斷某個信號是否在信號集中返回值:在集合:1;不在:0;出錯:-1?

使用以上這些函數創建完信號集后,要如何去改變阻塞信號集呢?系統又提供了一個函數:sigprocmask函數。

sigprocmask函數可以用來屏蔽信號,也可以用來解除屏蔽信號,其本質就是利用我們創建的信號集去改變阻塞信號集。

函數原型:

int?sigprocmask(int?how,?const?sigset_t?set,?sigset_t?oldset);?

返回值:

成功:0;失敗:-1,設置errno

參數解釋:

  • set:傳入參數,是一個位圖,set中哪位置1,就表示當前進程屏蔽哪個信號。
  • oldset:傳出參數,保存舊的信號屏蔽集。這個與setitimer有點相似。

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

例:把所有常規信號的未決狀態打印至屏幕。

#include??#include??#include???void?printPending(sigset_t?*set)?{?????int?i?=?0;??????for?(i?=?0;?i?<?32;?i++)?{?????????if?(sigismember(set,?i)?==?1)?????????????printf("1");?????????else?????????????printf("0");?????}?????printf("\n");?}??int?main()?{?????sigset_t?set,?oldset,?pendset;?????sigemptyset(&set);?????sigaddset(&set,?SIGQUIT);???//?ctrl?+?\?將產生SIGQUIT信號?????sigprocmask(SIG_BLOCK,?&set,?&oldset);?????while?(1)?{?????????sigpending(&pendset);?????????printPending(&pendset);?????//?寫一個函數打印未決信號集?????????sleep(1);?????}?}?

本文授權轉載自公眾號「良許Linux」。良許,世界500強外企Linux開發工程師,公眾號里分享大量Linux干貨,歡迎關注!

【責任編輯:

趙寧寧

TEL:(010)68476606】


點贊 0

總結

以上是生活随笔為你收集整理的_Linux系统编程—信号集操作函数的全部內容,希望文章能夠幫你解決所遇到的問題。

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