linux中一共有32種訊號,在/usr/include/bits/signum.h 標頭檔案中可以看到
#define sighup 1
#define sigint 2
#define sigquit 3
#define sigill 4
#define sigtrap 5
#define sigabrt 6
#define sigiot 6
#define sigbus 7
#define sigfpe 8
#define sigkill 9
#define sigusr1 10
#define sigsegv 11
#define sigusr2 12
#define sigpipe 13
#define sigalrm 14
#define sigterm 15
#define sigstkflt 16
#define sigcld sigchld
#define sigchld 17
#define sigcont 18
#define sigstop 19
#define sigtstp 20
#define sigttin 21
#define sigttou 22
#define sigurg 23
#define sigxcpu 24
#define sigxfsz 25
#define sigvtalrm 26
#define sigprof 27
#define sigwinch 28
#define sigpoll sigio
#define sigio 29
#define sigpwr 30
#define sigsys 31
#define sigunused 31
其中sigkill(9)與sigstop(19)是不能捕獲的,常用的ctrl+c 發出的是sigkill訊號。
子程序退出時會向父程序發出sigchld(17)訊號,預設情況下它是被遮蔽的。
sigstop與sigcont用來暫停和繼續目標程序。
sigabrt,sigalrm,sigfpe,sigpipe,sigint,sighup,sigill,sigquit,sigsegv,sigterm,sigusr1
,sigusr2這12種訊號,如果在程序中沒有對其進行捕獲處理的話,程序在收到它們時,會終止,當然還有不可捕獲的sigkill。
在終端中傳送訊號用kill命令,格式為 kill 訊號 目標程序pid,例如要殺掉1000號程序可以
kill -9 1000 或者 kill -kill 1000
在程式中kill函式的原型為 int kill(pid_t pid, int sig);
需要引入 和
killall cmd 與 kill pid 預設發出的是sigterm訊號。
在程序中需要等待某訊號時,可以用pause()函式,前提是在pause呼叫前一定有對目標訊號的捕獲機制,這樣在收到目標訊號後,程式會繼續執行。捕獲訊號最簡單的是signal函式 :
typedef void (*sighandler_t)(int);
sighandler_t signal(int signum, sighandler_t handler);
看著很複雜,用著很簡單,第乙個引數為目標訊號,第二個引數為處理方法,可以是自定義的函式,也可以是
sig_ign或者sig_dfl,前者表示目標訊號將被忽略,後者將其恢復預設。
#include
#include
#include
#include
#include
void handler()
int main()
程式將會阻塞至pause處,新開乙個終端,用kill命令向該程序傳送sigalrm訊號,
kill -14 pid
結果為
capture a sigalrm signal
end如果沒有事先進行訊號捕獲處理,即去掉 handler函式和signal函式,編譯執行,阻塞,新終端傳送sigalrm,則程式退出,顯示「鬧鐘」,這是中文系統的緣故。
鬧鐘訊號sigalrm在開頭提過,屬於12種沒有捕獲處理機制將導致程序終止的訊號,如果傳送的是這12種訊號以外的訊號,程序則沒有反應。
signal 函式比較老了,功能有一些限制,現在常用的是 sigaction
int sigaction(int signum, const struct sigaction *act,struct sigaction *oldact);
第乙個引數為目標訊號,第二個引數為sigaction結構,內有處理機制,訊號掩碼,和標誌。
#include
#include
#include
#include
#include
void handler(int sig)
int main()
效果與signal版本完全一樣
Linux訊號的捕獲
typedef void sighandler t int 功能 自定義的函式,以函式指標的方式用於下面的signal訊號註冊函式中的handler函式 sighandler t signal int signum,sighandler t handler 功能 訊號處理註冊函式 signum 訊號...
linux 訊號相關概念
訊號的阻塞就是讓系統暫時保留訊號待以後傳送。由於另外有辦法讓系統忽略訊號,所以一般情況下訊號的阻塞只是暫時的,只是為了防止訊號打斷敏感的操作。當需要修改某些全域性變數時,可以通過sigprocmask 函式阻塞處理函式中也使用該變數的訊號。在某些訊號處理函式中,為了防止同類訊號的到來,可以使用sig...
shell 移除訊號捕獲
本例中用到的trap命令會在每次檢測到sigint訊號時顯示一行簡單的文字訊息。捕獲這些訊號會阻止使用者用bash shell組合鍵ctrl c來停止程式 code macname macdemacbook pro desktop cat test.sh bin bash trap sigint e...