1.
函式說明
:
kill
和raise
是用來傳送訊號的
:
kill
把訊號傳送給程序或程序組
,它不僅可以中止程序,也可以向程序傳送其他訊號
;
raise
把訊號傳送給(程序
)自身.
它們的原型如下
:
#include
#include
int kill(pid_t pid, /*
指明要傳送的訊號程序號
*/
int signo);/*
訊號*/
int raise(int signo);/*
訊號*/
成功則返回
0, 出錯則返回
-1
從原型上可以看出
, raise
函式是可以通過
kill
實現的.
raise(signo);
等價於:
kill(getpid(), signo);
2. 引數說明
pid引數:
kill
函式中的
pid引數
, 它有以下
4種情況
:
pid > 0:
將該訊號傳送給程序id為
pid的程序
.
pid == 0:
將該訊號傳送給與傳送程序屬於同一程序組的所有程序
(不包括核心程序和
init
程序).
此時,
傳送程序必須具有向這些程序傳送訊號的許可權
.
pid < 0:
將該訊號發給其程序組
id等於
pid絕對值的所有程序
(不包括核心程序和
init
程序).
此時,
傳送程序必須具有向這些程序傳送訊號的許可權
.
pid == -1:
將該訊號傳送給傳送程序有許可權向它們傳送訊號的系統上的所有程序
.(不包括核心程序和
init
程序).
signo引數:
posix.1
將編號為
0的訊號定義為空訊號
. 如果
signo
引數是0,
則kill
仍執行正常的錯誤檢查
, 但不傳送訊號
. 這被用來確定乙個程序是否存在
.
訊號遮蔽字就是程序中被阻塞的訊號集
, 這些訊號不能傳送給該程序
, 它們在該程序中被"遮蔽
"了. 後面我們會提到
, 實際上它們是被阻塞了
.
2. 訊號遮蔽函式
:
#include
int sigprocmask(int how, const sigset_t *restrict set, sigset_t *restrict oset);
成功則返回
0, 出錯則返回
-1.
sigprocmask
函式有3
個引數:
how:
修改訊號遮蔽字的方式
.
set:
把這個訊號集設為新的當前訊號遮蔽字
. 如果為
null
則不改變
.
oset:
儲存程序舊的訊號遮蔽字
. 如果為
null
則不儲存
.
引數中的
how可以取3個值
:
sigprocmask
中的how
引數how 說明
sig_block
修改後,
該程序新的訊號遮蔽字是其當前遮蔽字和
set指向的訊號集的並集
.
sig_unblock
修改後,
該程序新的訊號遮蔽字是其當前遮蔽字和
set指向的訊號集的補集的交集
.
sig_setmask
修改後,
該程序新的訊號遮蔽字將被
set指向的訊號集的值代替
另外要說的是
, sigprocmask
只為單執行緒定義的
, 在多執行緒中要使用
pthread_sigmask.
3. 未處理的訊號
:
在呼叫訊號遮蔽的相關函式後
, 被遮蔽的訊號對於呼叫程序是阻塞的
, 不能傳送給呼叫程序
, 因此是未決的
. 取得這些阻塞的訊號集
, 可以通過呼叫
sigpending函式.
#include
int sigpending(sigset_t *set);
成功則返回
0, 出錯則返回
-1.
4. 例項
:
下面通過乙個簡單的例項來說明這篇文章中所講到的兩個函式
.
#include
#include
#include
#include
/* sigquit handler */
static void sig_quit(int signo)
int main()
/* 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 (sigismember(&pend, sigquit))
printf("sigquit pending ");
/* restore signal mask */
if (sigprocmask(sig_setmask, &old, null) < 0)
printf(" sigquit unblocked ");
printf("now try ctrl \");
sleep(5);
return 0;
}
這個程式在開始的時候用
sigprocmask
遮蔽了sigquit(ctrl+\
觸發), 在5
秒內觸發的該訊號將可以從
sigpending
中獲得;
然後程式把
sigquit
解除遮蔽
(恢復以前的遮蔽字
), 此時再觸發該訊號將呼叫
sig_quit
訊號處理函式
.
#include
int sigwait(const sigset_t *restrict set, int *restrict signop);
returns: 0 if ok, error number on failure
sigwait
的作用是:掛起程序,對於引數指向的
sigset_t
裡的訊號進行監測。如果所監視的訊號被阻塞,則它把阻塞訊號從掛起訊號集中刪除,解除對它的阻塞,然後返回。也就是它監測的程序必須是先進行阻塞處理的,它才監測到並且對訊號進行解除阻塞。。掛起訊號集是系統記錄被阻塞的訊號的資料結構。
總之:sigwait
監測引數指向的
sigset_t
裡的訊號一旦有訊號屬於它且被阻塞,則它解除訊號的阻塞,然後返回。
0
給主人留下些什麼吧!~~
訊號相關函式彙總
1.函式說明 kill 和raise 是用來傳送訊號的 kill 把訊號傳送給程序或程序組 它不僅可以中止程序,也可以向程序傳送其他訊號 raise 把訊號傳送給 程序 自身.它們的原型如下 include include int kill pid t pid,指明要傳送的訊號程序號 int sig...
linux 訊號相關函式 一
訊號共性 簡單 不能攜帶大量資訊 滿足條件才傳送 訊號的特質 訊號是軟體層面的 中斷。一旦訊號產生,無論程式執行到什麼位置,必須停止執行,處理訊號,處理結束,再繼續執行後續指令。所有訊號的產生及處理都是 由 核心完成的。產生訊號 1.按鍵產生 如 ctrl c 2.系統呼叫產生 如 kill 3.軟...
Linux訊號相關函式示例
程式在執行時,系統所傳來的指示。你在家呆著有人來敲門 linux下常見訊號 1 sighup 2 sigint 3 sigquit 4 sigill 5 sigtrap 6 sigabrt 7 sigbus 8 sigfpe 9 sigkill 10 sigusr1 11 sigse 12 sigu...