下面介紹一個範例程式名為 "signal",編譯此程式之後,把此程式run在背景,可以使用下面幾個指令,來觸發此程式當中的 printf來印出相對應的訊息,當然你也可以把 printf 改成你想做的事情
kill -SIGHUP `pidof signal`
kill -SIGINT `pidof signal`
kill -SIGQUIT `pidof signal`
======================= signal.c =================
#include <signal.h>
#include <unistd.h>
#include <stdio.h>
void sigroutine(int sig_num) {
switch(sig_num) {
case 1:
printf("Get a signal - SIGHUP \n");
case 3:
printf("Get a signal - SIGQUIT \n");
case 10:
printf("Get a signal - SIGUSR1 \n");
}
return;
}
int main() {
printf("process id is %d\n", getpid());
signal(SIGHUP, sigroutine);
signal(SIGQUIT, sigroutine);
signal(SIGUSR1, sigroutine);
for (;;) ;
}
==============================================
另外列出,所有可以帶入 kill 後面的sigmal列表(Reference from google)
2 - 就是我們常見的鍵盤中斷 CTRL+c
9 - 就是我們常用來kill process的 signal
信號 | 取值 | 默認動作 | 含義(發出信號的原因) |
---|---|---|---|
SIGHUP | 1 | Term | 終端的掛斷或進程死亡 |
SIGINT | 2 | Term | 來自鍵盤的中斷信號 |
SIGQUIT | 3 | Core | 來自鍵盤的離開信號 |
SIGILL | 4 | Core | 非法指令 |
SIGABRT | 6 | Core | 來自abort的異常信號 |
SIGFPE | 8 | Core | 浮點例外 |
SIGKILL | 9 | Term | 殺死 |
SIGSEGV | 11 | Core | 段非法錯誤(內存引用無效) |
SIGPIPE | 13 | Term | 管道損壞:向一個沒有讀進程的管道寫數據 |
SIGALRM | 14 | Term | 來自alarm的計時器到時信號 |
SIGTERM | 15 | Term | 終止 |
SIGUSR1 | 10 | Term | 用戶自定義信號1 |
SIGUSR2 | 12 | Term | 用戶自定義信號2 |
SIGCHLD | 20,17,18 | Ign | 子進程停止或終止 |
SIGCONT | 19,18,25 | Cont | 如果停止,繼續執行 |
SIGSTOP | 17,19,23 | Stop | 非來自終端的停止信號 |
SIGTSTP | 18,20,24 | Stop | 來自終端的停止信號 |
SIGTTIN | 21,21,26 | Stop | 後台進程讀終端 |
SIGTTOU | 22,22,27 | Stop | 後台進程寫終端 |
SIGBUS | 10,7,10 | Core | 總線錯誤(內存訪問錯誤) |
SIGPOLL | Term | Pollable事件發生(Sys V),與SIGIO同義 | |
SIGPROF | 27,27,29 | Term | 統計分佈圖用計時器到時 |
SIGSYS | 12,-,12 | Core | 非法系統調用(SVr4) |
SIGTRAP | 5 | Core | 跟踪/斷點自陷 |
SIGURG | 16,23,21 | Ign | socket緊急信號(4.2BSD) |
SIGVTALRM | 26,26,28 | Term | 虛擬計時器到時(4.2BSD) |
SIGXCPU | 24,24,30 | Core | 超過CPU時限(4.2BSD) |
SIGXFSZ | 25,25,31 | Core | 超過文件長度限制(4.2BSD) |
SIGIOT | 6 | Core | IOT自陷,與SIGABRT同義 |
SIGEMT | 7,-,7 | Term | |
SIGSTKFLT | -,16,- | Term | 協處理器堆棧錯誤(不使用) |
SIGIO | 23,29,22 | Term | 描述符上可以進行I/O操作 |
SIGCLD | -,-,18 | Ign | 與SIGCHLD同義 |
SIGPWR | 29,30,19 | Term | 電力故障(System V) |
SIGINFO | 29,-,- | 與SIGPWR同義 | |
SIGLOST | -,-,- | Term | 文件鎖丟失 |
SIGWINCH | 28,28,20 | Ign | 窗口大小改變(4.3BSD, Sun) |
SIGUNUSED | -,31,- | Term | 未使用信號(will be SIGSYS) |
另外在Linux底下,輸入 kill -l 也可以看到這些SIGXXX 所定義的編號,如下:
$ kill -l
1) SIGHUP 2) SIGINT 3) SIGQUIT 4) SIGILL
5) SIGTRAP 6) SIGABRT 7) SIGBUS 8) SIGFPE
9) SIGKILL 10) SIGUSR1 11) SIGSEGV 12) SIGUSR2
13) SIGPIPE 14) SIGALRM 15) SIGTERM 17) SIGCHLD
18) SIGCONT 19) SIGSTOP 20) SIGTSTP 21) SIGTTIN
22) SIGTTOU 23) SIGURG 24) SIGXCPU 25) SIGXFSZ
26) SIGVTALRM 27) SIGPROF 28) SIGWINCH 29) SIGIO
30) SIGPWR 31) SIGSYS 34) SIGRTMIN 35) SIGRTMIN+1
36) SIGRTMIN+2 37) SIGRTMIN+3 38) SIGRTMIN+4 39) SIGRTMIN+5
40) SIGRTMIN+6 41) SIGRTMIN+7 42) SIGRTMIN+8 43) SIGRTMIN+9
44) SIGRTMIN+10 45) SIGRTMIN+11 46) SIGRTMIN+12 47) SIGRTMIN+13
48) SIGRTMIN+14 49) SIGRTMIN+15 50) SIGRTMAX-14 51) SIGRTMAX-13
52) SIGRTMAX-12 53) SIGRTMAX-11 54) SIGRTMAX-10 55) SIGRTMAX-9
56) SIGRTMAX-8 57) SIGRTMAX-7 58) SIGRTMAX-6 59) SIGRTMAX-5
60) SIGRTMAX-4 61) SIGRTMAX-3 62) SIGRTMAX-2 63) SIGRTMAX-1
64) SIGRTMAX