Linux訊號處理

2021-09-08 14:50:58 字數 2965 閱讀 4470

訊號是一種軟體中斷,程式收到訊號時,就會呼叫相應的處理函式(如果有註冊)。

void (*signal(int signum,void(* handler)(int)))(int); -- 設定訊號處理方式

訊號處理函式原型

void   foo(int arg);

系統定義的訊號有:

/* signals.  */

#define sighup1/* hangup (posix).  */

#define sigint2/* interrupt (ansi).  */

#define sigquit3/* quit (posix).  */

#define sigill4/* illegal instruction (ansi).  */

#define sigtrap5/* trace trap (posix).  */

#define sigabrt6/* abort (ansi).  */

#define sigiot6/* iot trap (4.2 bsd).  */

#define sigbus7/* bus error (4.2 bsd).  */

#define sigfpe8/* floating-point exception (ansi).  */

#define sigkill9/* kill, unblockable (posix).  */

#define sigusr110/* user-defined signal 1 (posix).  */

#define sigse**11/* segmentation violation (ansi).  */

#define sigusr212/* user-defined signal 2 (posix).  */

#define sigpipe13/* broken pipe (posix).  */

#define sigalrm14/* alarm clock (posix).  */

#define sigterm15/* termination (ansi).  */

#define sigstkflt16/* stack fault.  */

#define sigcldsigchld/* same as sigchld (system v).  */

#define sigchld17/* child status has changed (posix).  */

#define sigcont18/* continue (posix).  */

#define sigstop19/* stop, unblockable (posix).  */

#define sigtstp20/* keyboard stop (posix).  */

#define sigttin21/* background read from tty (posix).  */

#define sigttou22/* background write to tty (posix).  */

#define sigurg23/* urgent condition on socket (4.2 bsd).  */

#define sigxcpu24/* cpu limit exceeded (4.2 bsd).  */

#define sigxfsz25/* file size limit exceeded (4.2 bsd).  */

#define si**talrm26/* virtual alarm clock (4.2 bsd).  */

#define sigprof27/* profiling alarm clock (4.2 bsd).  */

#define sigwinch28/* window size change (4.3 bsd, sun).  */

#define sigpollsigio/* pollable event occurred (system v).  */

#define sigio29/* i/o now possible (4.2 bsd).  */

#define sigpwr30/* power failure restart (system v).  */

#define sigsys31/* bad system call.  */

#define sigunused31

#define_nsig65/* biggest signal number + 1

(including real-time signals).  */

#define sigrtmin        (__libc_current_sigrtmin ())

#define sigrtmax        (__libc_current_sigrtmax ())

向程序傳送訊號(在終端)

kill -s signal pid  -- signal的值是上面列表中的合法值

kill -s 9 pid  -- 該命令會結束指定的程序

下面的例子顯示程序接收到的訊號

#include #include 

#include

void handler(int

arg)

intmain()

return0;

}

可以用kill -s 9 pid結束它

kill也是乙個可呼叫的api

int kill(pid_t pid,int sig); 

kill()可以用來送引數 sig指定的訊號給引數pid指定的程序。

引數pid有幾種情況: 

pid>0 將訊號傳給程序識別碼為 pid的程序。 

pid=0 將訊號傳給和目前程序相同程序組的所有程序 

pid=-1 將訊號廣播傳送給系統內所有的程序

pid<0 將訊號傳給程序組識別碼pid絕對值的所有程序

Linux 訊號處理

用sigcation函式 在標頭檔案signal.h中 來設定自己的訊號處理函式,用法參見 各種訊號參見 寫了個sigint,也就是c c鍵的處理例子 include includestruct sigaction newsigint,oldsigint void signalinthandler ...

linux 訊號處理

linux下的程式,有時候需要在接到一些終止訊號後,進行清理工作再退出。訊號2的處理函式 void signalhandler 2 int signal cleanup exit 2 int main int argc,char argv 處理訊號2 struct sigaction act 2,a...

Linux程序訊號 訊號處理

一 訊號相關概念 1.實際執行訊號的處理動作稱為訊號遞達 delivery 2.訊號從產生到遞達之間的狀態稱為訊號未決 pending 不一定會立即delivery 3.程序可以選擇阻塞 block 某個訊號。不會遞達 4.被阻塞的訊號產生時將保持在未決狀態,知道程序解除對此訊號 的阻塞,才會執行遞...