信號:
信號是組概念,發(fā)送方和接收方需要配對存在概漱,比如進程A發(fā)送信號X給進程B啥纸,進程B接收信號按信號處理函數(shù)進行響應(yīng),具體的處理流程是:
1.1 用戶按下Ctrl-C誓斥,這個鍵盤輸入產(chǎn)生一個硬件中斷只洒。
1.2 該進程的用戶空間代碼暫停執(zhí)行,CPU從用戶態(tài)切換到內(nèi)核態(tài)處理硬件中斷劳坑。
1.3 終端驅(qū)動程序?qū)trl-C解釋成一個SIGINT信號毕谴,記在該進程的PCB中(也可以說發(fā)送了一個SIGINT信號給該進程)。
1.4 內(nèi)核返回到該進程的用戶空間代碼繼續(xù)執(zhí)行之前距芬,首先處理PCB中記錄的信號涝开,發(fā)現(xiàn)有一個SIGINT信號待處理,而這個信號的默認處理動作是終止進程框仔,所以直接終止進程而不再返回它的用戶空間代碼執(zhí)行舀武。
2. 信號集有哪些?
kill -l && man 7 signal
3. 觸發(fā)信號的常用操作
Ctrl-C SIGINT
Ctrl-\ SIGQUI
Ctrl-Z SIGTSTP
kill -l USERSIG PID
4. 相關(guān)AP
I//為信號設(shè)置處理方法
int sigaction(int signum, const struct sigaction *act, struct sigaction *oldact);//sigprocmask, rt_sigprocmask - examine and change blocked signals
//為進程添加阻塞信號集离斩,表示進程接收到其中的信號并不立即處理银舱,而是等到進程解除阻塞后再處理
int sigprocmask(int how, const sigset_t *set, sigset_t *oldset);//添加信號到信號集中int sigaddset(sigset_t *set, int signum);//從信號集中刪除信號int sigdelset(sigset_t *set, int signum);
//判斷信號是否是信號集中元素瘪匿?
int sigismember(const sigset_t *set, int signum);
5. struct sigaction之sa_mask與sa_mask
struct sigaction {?
?void (*sa_handler)(int);?
?void (*sa_sigaction)(int, siginfo_t *, void *);?
?sigset_t sa_mask;?
?int sa_flags;?
?void (*sa_restorer)(void);};
sa_mask是信號阻塞集sa_flags是信號修改標志
6. 代碼
#include <stdio.h>
#include <signal.h>
void
main(int argc, char *argv[])
{
? ? ? ? struct sigaction act;
? ? ? ? sigemptyset(&act.sa_mask);
? ? ? ? act.sa_flags = 0;
? ? ? ? act.sa_handler = sig_int_handler;
? ? ? ? sigaction(SIGINT, &act, NULL);
? ? ? ? sleep(3);
? ? ? ? printf("Sample for signal programming end\n");
}
void
sig_int_handler(int signum)
{
? ? ? ? printf("Got a signal of %d\n", signum);
}