LinuxNP 訊號與訊號處理函式

2021-10-03 08:40:11 字數 4228 閱讀 8231

程序a向程序b傳送訊號

忽略/恢復某訊號

訊號是當作業系統中某些情況發生改變時,由作業系統向程序傳送,程序可對訊號進行捕捉並處理;

程序缺省會對不同的訊號進行處理,使用者可通過自定義訊號處理函式並使用signal()將自定義的訊號處理函式與指定訊號進行繫結,

訊號處理函式在訊號預設處理方式之前呼叫,原先處理方式不執行

在 中,訊號名都被定義為正整數常量,訊號名都以 sig 開頭;

☞ 訊號的檢視

[user@localhost day0416_linux_signal]$ kill -l

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

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

11) sigse** 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) si**talrm 27) sigprof 28) sigwinch 29) sigio 30) sigpwr

31) sigsys 34) sigrtmin 35) sigrtmin+1 36) sigrtmin+2 37) sigrtmin+3

38) sigrtmin+4 39) sigrtmin+5 40) sigrtmin+6 41) sigrtmin+7 42) sigrtmin+8

43) sigrtmin+9 44) sigrtmin+10 45) sigrtmin+11 46) sigrtmin+12 47) sigrtmin+13

48) sigrtmin+14 49) sigrtmin+15 50) sigrtmax-14 51) sigrtmax-13 52) sigrtmax-12

53) sigrtmax-11 54) sigrtmax-10 55) sigrtmax-9 56) sigrtmax-8 57) sigrtmax-7

58) sigrtmax-6 59) sigrtmax-5 60) sigrtmax-4 61) sigrtmax-3 62) sigrtmax-2

63) sigrtmax-1 64) sigrtmax

[user@localhost day0416_linux_signal]$

☞ 引入示例

#include #include int main()
1> signal訊號註冊函式原型

#include typedef void (*dighandler_t)(int)      //定義了函式指標

sighandler_t signal(int signum,sighandler_t handler);

2> sigpipe訊號和sigint訊號sigpipe:(管道訊號) 當伺服器斷開連線,客戶端向伺服器傳送資料時,客戶端收到的訊號;

sigint:(終端訊號) 當某程序執行時被ctrl+c終止,則該程序會收到sigint訊號;

終止當前程序:ctrl+cctrl+\

#include void sig_pipe(int sign)

void sig_int(int sign)

int main()

3> sigalrm訊號

alarm(unsigned int second) 函式傳入的秒數減少到0時,作業系統向當前程序傳送sigalrm訊號;返回值:每個程序只能有乙個鬧鐘時間,如果在呼叫alarm之前已經為該程序設定了鬧鐘時間,則上次鬧鐘時間的剩餘值將會作為本次alarm的返回值,否則返回0;

#include //printf

#include //sleep、alarm

#include //signal、aigalrm

void handler()

int main()

return 0;

}

附加:alarm() 和 pause() 組合使用可以使程序掛起一段時間;(二者均位於 標頭檔案中!

pause() 會掛機呼叫程序直到接收到乙個訊號;

4> sigabrt訊號

abort()方法位於stdlib.h標頭檔案中,用於異常終止乙個程序;

訊號註冊函式後,abort() 函式不會被阻塞!

#include #include int main()
#include #include #include void sig_abrt(int sign)

int main()

5> sigchld 訊號

當乙個程序終止時,作業系統將 sigchld訊號 傳送給其父程序,按系統預設將忽略此訊號。

#include #include #include #include #include void sig_chld(int sign)

int main()

}else

}

printf("...\n");

return 0;

}

執行結果:

[root@localhost day0229_2_signal]# gcc -o test_sigchld test_sigchld.c -std=c99

[root@localhost day0229_2_signal]# ./test_sigchld

子程序執行中!

子程序執行中!

子程序執行中!

子程序執行中!

子程序執行中!

...捕捉到子程序結束訊號sigchld!

...[root@localhost day0229_2_signal]#

1> 函式原型

int kill(pid_t pid,int sig);
pid>0時,將sig訊號傳送給pid程序;

pid==0時,將sig訊號傳送給當前程序同組的所有程序;

pid==-1時,將sig訊號傳送給所有程序;

typedef void (*sighandler_t)(int);

sighandler_t signal(int signum, sighandler_t handler);

引數二handler是乙個處理函式,或者是:

sig_ign:忽略引數signum所指的訊號。(ignore)

sig_dfl:恢復引數signum所指訊號的處理方法為預設值。(default)

要求:父子程序同時執行時按下ctrl+c終止子程序,而非父程序

#include #include #include #include #include #define ok 0

#define error -1

int main()else

return ok;

}

訊號處理,訊號佇列

最近幾天在看訊號,對實時訊號的實時性不是很理解,今天看了下 dequeue signal 差不多理解了,乙個實時訊號可以有多個實時佇列,在signal集合裡乙個signal可能有多個signal佇列。訊號,有訊號佇列,有訊號集 sigpending是訊號pending的結構體,裡面有sigqueue...

訊號及訊號處理(二) 可靠訊號與不可靠訊號

一 可靠訊號與不可靠訊號有哪些?sighup 1號 至 sigsys 31號 之間的訊號都是繼承自unix系統,是不可靠訊號,也稱為非實時訊號 sigrtmin 33號 與 sigrtmax 64號 之間的訊號,它們都是可靠訊號,也稱為實時訊號 二 什麼是可靠訊號?可靠性是指訊號是否會丟失,即該訊號...

訊號 系統與訊號處理邊角雜談

1.連續時間訊號的傅利葉變換一般寫為x j 而離散時間訊號的傅利葉變換一般寫為x ej 第乙個原因是,連續時間訊號傅利葉定積分中的ej t最終會運算成 而離散時間訊號傅利葉累加中的ej n最終會運算成ej 第二個原因是,將j 直接替換為s就在形式上得到laplas變換,將ej 直接替換為z就在形式上...