Linux系統程式設計 訊號集操作函式

2021-10-11 05:11:19 字數 1381 閱讀 8950

先來回顧一下未決訊號集是怎麼回事。

訊號從產生到抵達目的地,叫作訊號遞達。而訊號從產生到遞達的中間狀態,叫作訊號的未決狀態。產生未決狀態的原因有可能是訊號受到阻塞了,也就是訊號遮蔽字(或稱阻塞訊號集,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

引數解釋:

how引數取值:

假設當前的訊號遮蔽字為mask

我們如何讀取未決訊號集?系統提供了sigpending函式。

函式原型:

int sigpending(sigset_t *set);引數說明:set傳出引數。

返回值:

返回值:成功:0;失敗:-1,設定errno

例:把所有常規訊號的未決狀態列印至螢幕。

#include  #include  #include   void printpending(sigset_t *set)      printf("\n"); }  int main()  }tel:(010)68476606】

點讚 0

Linux系統程式設計 訊號

0x00 訊號和中斷類似,中斷是硬體發出,而訊號由軟體發出。訊號常用於程序間通訊,乙個訊號常見的處理如下 1 設定對應訊號的訊號處理函式。2 當訊號來臨時,打斷正常執行的程式 本質上是在系統呼叫前檢查是否有訊號的到來 去執行訊號處理函式。3 訊號處理函式執行完,繼續執行原程式。0x01 我們先來看一...

Linux系統程式設計 訊號

基本概念 訊號的狀態 產生未決狀態 沒有被處理的 遞達 已經被處理的 訊號的優先順序比較高 程序收到訊號之後,暫停正在處理的工作 訊號集 kill 發射訊號給某個程序 raise 自己給自己發訊號 函式原型 int raise int sig abort 給自己傳送異常終止的訊號 alarm 設定定...

Linux系統程式設計 訊號

訊號的共性 1.簡單 2.不能攜帶大量資訊 3.滿足特定條件才能傳送 訊號的機制 1.訊號是軟體層面的中斷。一旦訊號產生,無論程式執行到什麼位置都必須結束 2.所有訊號的產生以及處理都是核心產生.訊號的產生 1.按鍵產生 程ctrl c ctrl v 2.系統呼叫產生 kill函式 3.定時器 al...