1. 概念:
訊號遮蔽字就是程序中被阻塞的訊號集, 這些訊號不能傳送給該程序, 它們在該程序中被"遮蔽"了. 後面我們會提到, 實際上它們是被阻塞了.
2. 訊號遮蔽函式:
#include
<
signal.h
>
intsigprocmask(
inthow,
const
sigset_t
*restrict
set, sigset_t
*restrict oset);
成功則返回0, 出錯則返回-1
. sigprocmask函式有3個引數:
引數中的how可以取3個值:
sigprocmask中的how引數
how說明
sig_block
修改後, 該程序新的訊號遮蔽字是其當前遮蔽字和set指向的訊號集的並集.
sig_unblock
修改後, 該程序新的訊號遮蔽字是其當前遮蔽字和set指向的訊號集的補集的交集.
sig_setmask
修改後, 該程序新的訊號遮蔽字將被set指向的訊號集的值代替
另外要說的是, sigprocmask只為單執行緒定義的, 在多執行緒中要使用pthread_sigmask.
3. 未處理的訊號:
在呼叫訊號遮蔽的相關函式後, 被遮蔽的訊號對於呼叫程序是阻塞的, 不能傳送給呼叫程序, 因此是未決的. 取得這些阻塞的訊號集, 可以通過呼叫sigpending函式.
#include
<
signal.h
>
intsigpending(sigset_t
*set
);成功則返回0, 出錯則返回-1
. 4. 例項:
下面通過乙個簡單的例項來說明這篇文章中所講到的兩個函式.
#include
<
signal.h
>
#include
<
unistd.h
>
#include
<
stdlib.h
>
#include
<
stdio.h
>
/*sigquit handler
*/static
void
sig_quit(
intsigno)
intmain()
/*add sigquit to sigset
*/ if
(sigemptyset(
&new
) <0)
perror(
"sigemptyset");
if(sigaddset(
&new
, sigquit)
<0)
perror(
"sigaddset");
/*mask sigquit
*/ if
(sigprocmask(sig_setmask,
&new, &
old)
<0)
printf(
"sigquit is blocked ");
printf(
"now try ctrl / ");
sleep(
5);
/*sigquit will pending
*/ /*
get pending
*/ if
(sigpending(
&pend)
<0)
perror(
"sigpending");
if(sigi**ember(
&pend, sigquit))
printf(
"sigquit pending ");
/*restore signal mask
*/ if
(sigprocmask(sig_setmask,
&old, null)
<0)
printf(
"sigquit unblocked ");
printf(
"now try ctrl / ");
sleep(5);
return0;
} 這個程式在開始的時候用sigprocmask遮蔽了sigquit(ctrl+/觸發), 在5秒內觸發的該訊號將可以從sigpending中獲得; 然後程式把sigquit解除遮蔽(恢復以前的遮蔽字), 此時再觸發該訊號將呼叫sig_quit訊號處理函式.
Linux Signal 訊號機制
訊號捕捉實際操作流程 基礎概念 unix訊號利用程序間通訊向程序傳送訊號,可使接收程序受訊號影響 終止 掛機 繼續 命令發出訊號 kill 訊號編號 程序id kill 9 1234 kill l 檢視系統支援的訊號 其中 1 31 unix經典訊號 軟體開發工程師 34 64 實時訊號 驅動開發 ...
Linux Signal 5 訊號遮蔽字
1.概念 訊號遮蔽字就是程序中被阻塞的訊號集,這些訊號不能傳送給該程序,它們在該程序中被 遮蔽 了.後面我們會提到,實際上它們是被阻塞了.2.訊號遮蔽函式 include int sigprocmask int how,const sigset t restrict set,sigset t res...
Linux Signal 訊號量的使用
訊號量是什麼?訊號量是用在不同程序之間或者是不同程序的執行緒之間用來同步會用到的源語。用於保護 段,只能被乙個程序或者是執行緒執行,這種工作需要乙個二進位制的開關。獲得共享資源程序需要執行的步驟 1 測試控制該資源的訊號 量。2 如果訊號量為正,表示可以使用當前的訊號量,訊號量值減1,使用完成後,對...