linux訊號捕獲相關

2021-08-07 13:41:54 字數 2981 閱讀 9286

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...