訊號集與阻塞訊號

2021-08-02 14:22:17 字數 3057 閱讀 3160

訊號是一種軟體中斷,是一種處理程序間非同步的通訊機制。訊號可以導致乙個正在執行的程序被另乙個非同步程序中斷,轉而處理某乙個突發事件。

常見的訊號

kill -l 命令檢視

1) sighup 2) sigint 3) sigquit 4) sigill 5) sigtrap

6) sigabrt 7) sigbus 8) sigfpe 9) sigkill 10) sigusr1

11) sigsegv 12) sigusr2 13) sigpipe 14) sigalrm 15) sigterm

16) sigstkflt 17) sigchld 18) sigcont 19) sigstop 20) sigtstp

21) sigttin 22) sigttou 23) sigurg 24) sigxcpu 25) sigxfsz

26) sigvtalrm 27) sigprof 28) sigwinch 29) sigio 30) sigpwr

31) sigsys

通常對於乙個程序傳送訊號時

//用乙個簡單的死迴圈驗證,當按下組合鍵ctrl-c時,就是向該程序傳送了乙個訊號,終止該程序。

#include

int main()

#include

int main()

//進行了除0的操作,硬體異常產生訊號sigfpe,程序異常退出

程序執行後異常退出,並顯示core dumped。

core dumped:表示乙個程序異常退出,作業系統會將異常資訊轉儲到硬碟上,是便於gdb除錯。

- 終止程序訊號。程序呼叫kill函式可以發生訊號給另乙個程序,也可以kill命令傳送訊號給某個程序。

//任意程序之間傳送任意訊號

#include

#include

int kill(pid_t pid, int sig);

//pid是傳遞訊號的程序號,sig為傳送的訊號值

//乙個程序給自己傳送任意訊號

#include

int raise(int sig)

//乙個程序給自己傳送唯一訊號

#include

void

abort(void);

//特定時間後給程序傳送訊號(sigalrm),該訊號的預設動作是終止該程序

#include

unsigned

int alarm(unsigned

int seconds);

//函式的返回值是0或設定的鬧鐘剩餘的秒數

#include 

typedef void (*sighandler_t)(int);

sighandler_t signal(int signum, sighandler_t handler);

//訊號處理函式,第乙個引數為接收到的訊號,第二個引數函式指標使接收到訊號後處理**入口。

#include 

int sigemptyset(sigset_t *set);

//對set指向的訊號集進行初始化,使所有訊號的清空,即沒有任何訊號再集合中

int sigfillset(sigset_t *set);

//用來填空填空訊號集,即阻塞所有訊號

int sigaddset(sigset_t *set, int signum);

//將某個訊號新增到訊號集,第乙個引數為新增的訊號集,第二個為新增的訊號

int sigdelset(sigset_t *set, int signum);

//從訊號集中刪除某個訊號

int sigismember(const sigset_t *set, int signum);

//檢測訊號集是否為空

#include 

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

//讀取或改變程序的訊號遮蔽字。成功返回0,失敗則返回-1.

如果oldset非空,則讀取程序當前的訊號遮蔽字通過oldset傳出。如果set非空,則更改程序的訊號遮蔽字,引數how表示如何更改。如果set和oldset都非空,則先將原來的遮蔽字備份到oldset,再根據set和how引數更改遮蔽字。

how含義sig_block:將第二個引數所描述的集合新增到當前程序阻塞的訊號中

sig_unblock:將第二個引數鎖描述的集合從當前的程序阻塞的訊號集中刪除

sig_setmask:無論之前的阻塞號。設定當前程序阻塞的集合的第二個引數描述的物件

#include 

int sigpending(sigset_t *set);

//讀取當前程序的未決訊號集,通過set引數傳出。成功返回0,失敗返回-1

#include 

int sigpending(sigset_t *set);

//讀取當前的未決訊號,通過set傳出

**實現:

linux訊號 阻塞訊號

1.訊號在核心中的表示 我們知道了訊號產生的各種原因,而實際執行訊號處理的動作,叫做訊號遞達 delivery 訊號從產生到遞達之間的狀態,稱為訊號未決 pending 程序可以選擇阻塞 block 某個訊號。被阻塞的訊號產生時將保持在未決狀態,直到程序解除對此訊號的阻塞,才執行遞達的動作。注意,阻...

訊號「未決」與「阻塞」

訊號狀態 訊號的 未決 是一種狀態,指的是從訊號的產生到訊號被處理前的這一段時間 訊號的 阻塞 是乙個開關動作,指的是阻止訊號被處理,但不是阻止訊號產生。apue例題在sleep前用sigprocmask阻塞了退出訊號,然後sleep,然後在sleep的過程中產生乙個退出訊號,但是此時退出訊號被阻塞...

訊號「未決」與「阻塞」

訊號狀態 訊號的 未決 是一種狀態,指的是從訊號的產生到訊號被處理前的這一段時間 訊號的 阻塞 是乙個開關動作,指的是阻止訊號被處理,但不是阻止訊號產生。apue例題在sleep前用sigprocmask阻塞了退出訊號,然後sleep,然後在sleep的過程中產生乙個退出訊號,但是此時退出訊號被阻塞...