訊號是一種軟體中斷,程式收到訊號時,就會呼叫相應的處理函式(如果有註冊)。
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.被阻塞的訊號產生時將保持在未決狀態,知道程序解除對此訊號 的阻塞,才會執行遞...