1.Linxu下使用signal()函數獲取信號:
signal()函數:
[cpp] view plaincopy
-
#include <signal.h>
-
-
typedef void (*sighandler_t)(int);
-
-
sighandler_t signal(int signum, sighandler_t handler);
返回值:
[cpp] view plaincopy
-
signal() returns the previous value of the signal handler, or SIG_ERR
-
on error.
關於返回值中涉及到的signal hander:
[cpp] view plaincopy
-
signal() sets the disposition of the signal signum to handler, which is
-
either SIG_IGN, SIG_DFL, or the address of a programmer-defined func‐
-
tion (a "signal handler").
-
-
If the signal signum is delivered to the process, then one of the fol‐
-
lowing happens:
-
-
* If the disposition is set to SIG_IGN, then the signal is ignored.
-
-
* If the disposition is set to SIG_DFL, then the default action asso‐
-
ciated with the signal (see signal(7)) occurs.
-
-
* If the disposition is set to a function, then first either the dis‐
-
position is reset to SIG_DFL, or the signal is blocked (see Porta‐
-
bility below), and then handler is called with argument signum. If
-
invocation of the handler caused the signal to be blocked, then the
-
signal is unblocked upon return from the handler.
-
-
The signals SIGKILL and SIGSTOP cannot be caught or ignored.
eg.:獲取用戶的CTRL + C 和 CTRL + \ (進程中斷和結束命令)信號:
[cpp] view plaincopy
-
#include <stdio.h>
-
#include <stdlib.h>
-
#include <string.h>
-
#include <signal.h>
-
-
void my_func(int sign_no)
-
{
-
if(sign_no == SIGINT)
-
{
-
printf("get the signal: SIGINT\n");
-
}else if(sign_no == SIGQUIT)
-
{
-
printf("get the signal: SIGOUT\n");
-
}
-
}
-
-
int main(void)
-
{
-
printf("waiting for signal SIGINT or SIGOUT ...\n");
-
signal(SIGINT, my_func);
-
signal(SIGQUIT, my_func);
-
-
pause();
-
-
return 0;
-
}
2.sigaction()的使用:
sigaction結搆體為:
[cpp] view plaincopy
-
struct sigaction {
-
union {
-
__sighandler_t _sa_handler;
-
void (*_sa_sigaction)(int, struct siginfo *, void *);
-
} _u;
-
sigset_t sa_mask;
-
unsigned long sa_flags;
-
void (*sa_restorer)(void);
-
};
eg:衕樣是捕捉ctrl+c發送的SIGINT與ctrl+\發送的SIGQUIT信號
[cpp] view plaincopy
-
#include <stdio.h>
-
#include <stdlib.h>
-
#include <string.h>
-
#include <signal.h>
-
-
void my_func(int sign_no)
-
{
-
if(sign_no == SIGINT)
-
{
-
printf("get the signal: SIGINT\n");
-
}else if(sign_no == SIGQUIT)
-
{
-
printf("get the signal: SIGQUIT\n");
-
}
-
}
-
-
int main(void)
-
{
-
struct sigaction action;
-
-
printf("Waiting for signal ...\n");
-
action.sa_handler = my_func;
-
sigemptyset(&action.sa_mask);
-
action.sa_flags = 0;
-
sigaction(SIGINT, &action, 0);
-
sigaction(SIGQUIT, &action, 0);
-
pause();
-
-
return 0;
-
}
eg:自定義退出函數:
[cpp] view plaincopy
-
sigact.sa_handler = mysighandler;
-
sigemptyset(&sigact.sa_mask);
-
sigact.sa_flags = 0;
-
sigaction(SIGINT, &sigact, NULL);
-
sigaction(SIGTERM, &sigact, NULL);
-
sigaction(SIGQUIT, &sigact, NULL);
信號表:
[cpp] view plaincopy
-
1) SIGHUP (掛起) 當運行進程的用戶注銷時通知該進程,使進程終止
-
-
2) SIGINT (中斷) 當用戶按下時,通知前台進程組終止進程
-
-
3) SIGQUIT (退出) 用戶按下或時通知進程,使進程終止
-
-
4) SIGILL (非法指令) 執行了非法指令,如可執行文件本身出現錯誤、試圖執行數據段、堆棧溢出
-
-
5) SIGTRAP 由斷點指令或其它trap指令產生. 由debugger使用
-
-
6) SIGABRT (異常中止) 調用abort函數生成的信號
-
-
7) SIGBUS 非法地址, 包括內存地址對齊(alignment)出錯. eg: 訪問一個四個字長的整數, 但其地址不是4的倍數.
-
-
8) SIGFPE (算朮異常) 發生致命算朮運算錯誤,包括浮點運算錯誤、溢出及除數為0.
-
-
9) SIGKILL (確認殺死) 當用戶通過kill -9命令向進程發送信號時,可靠的終止進程
-
-
10) SIGUSR1 用戶使用
-
-
11) SIGSEGV (段越界) 當進程嘗試訪問不屬於自己的內存空間導致內存錯誤時,終止進程
-
-
12) SIGUSR2 用戶使用
-
-
13) SIGPIPE 寫至無讀進程的管道, 或者Socket通信SOCT_STREAM的讀進程已經終止,而再寫入。
-
-
14) SIGALRM (超時) alarm函數使用該信號,時鐘定時器超時響應
-
-
15) SIGTERM (軟中斷) 使用不帶參數的kill命令時終止進程
-
-
17) SIGCHLD (子進程結束) 當子進程終止時通知父進程
-
-
18) SIGCONT (暫停進程繼續) 讓一個停止(stopped)的進程繼續執行. 本信號不能被阻塞.
-
-
19) SIGSTOP (停止) 作業控制信號,暫停停止(stopped)進程的執行. 本信號不能被阻塞, 處理或忽略.
-
-
20) SIGTSTP (暫停/停止) 交互式停止信號, Ctrl-Z 發出這個信號
-
-
21) SIGTTIN 當后台作業要從用戶終端讀數據時, 終端驅動程序產生SIGTTIN信號
-
-
22) SIGTTOU 當后台作業要往用戶終端寫數據時, 終端驅動程序產生SIGTTOU信號
-
-
23) SIGURG 有"緊急"數據或網絡上帶外數據到達socket時產生.
-
-
24) SIGXCPU 超過CPU時間資源限制. 這個限制可以由getrlimit/setrlimit來讀取/改變。
-
-
25) SIGXFSZ 當進程企圖擴大文件以至於超過文件大小資源限制。
-
-
26) SIGVTALRM 虛擬時鐘信號. 類似於SIGALRM, 但是計算的是該進程占用的CPU時間.
-
-
27) SIGPROF (梗概時間超時) setitimer(2)函數設置的梗概統計間隔計時器(profiling interval timer)
-
-
28) SIGWINCH 窗口大小改變時發出.
-
-
29) SIGIO(異步I/O) 文件描述符准備就緒, 可以開始進行輸入/輸出操作.
-
-
30) SIGPWR 電源失效/重啟動
-
-
31) SIGSYS 非法的系統調用。
在以上列出的信號中,
程序不可捕獲、阻塞或忽略的信號有:SIGKILL,SIGSTOP
不能恢復至默認動作的信號有:SIGILL,SIGTRAP
默認會導致進程流產的信號有:SIGABRT,SIGBUS,SIGFPE,SIGILL,SIGIOT,SIGQUIT,SIGSEGV,SIGTRAP,SIGXCPU,SIGXFSZ
默認會導致進程退出的信號有:SIGALRM,SIGHUP,SIGINT,SIGKILL,SIGPIPE,SIGPOLL,SIGPROF,SIGSYS,SIGTERM,SIGUSR1,SIGUSR2,SIGVTALRM
默認會導致進程停止的信號有:SIGSTOP,SIGTSTP,SIGTTIN,SIGTTOU
默認進程忽略的信號有:SIGCHLD,SIGPWR,SIGURG,SIGWINCH
此外,SIGIO在SVR4是退出,在4.3BSD中是忽略;SIGCONT在進程掛起時是繼續,否則是忽略,不能被阻塞。
http://blog.csdn.net/g457499940/article/details/14518783