設定收到 signal 後的處理方式
(alarm 是 signal 的一種)
Signal
定義
#include <signal.h>
sighandler_t signal(int signum, sighandler_t handler);
用法
void ctrl_c(int signal)
{
printf("\nWaiting close ...\n");
sleep(1);
exit(0);
}
int main(int argc, char **argv) {
signal(SIGINT, ctrl_c);
}
查詢所有 Signal 指令
~$ 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
16) SIGSTKFLT 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
左邊的數字是此 Signal 在這平台的數值(某些平台會有部份差異)
(SIGKILL 與 SIGSTOP 無法補獲)
送 Signal 給 pid 或 執行中程式名稱
kill -SIGUSR1 12333 // 12333 為 pid 數值
killall -SIGUSR1 program_name // program_name 為 執行中程式名稱
常用 Signal 種類
SIGUSR1 // 自定義1
SIGUSR2 // 自定義2
SIGALRM // 鬧鐘
SIGCHLD // 接收Z的狀態
SIGINT // Ctrl + C
SIGTERM // kill
SIGKILL // 強制 kill
SIGPIPE // 當socket已收到RST後,還繼續送資料,就會收到 SIGPIPE
忽略特定 Signal 語法
signal(SIGPIPE, SIG_IGN); // 忽略 SIGPIPE
忽略行程產生的 Z
static void child_signal(int sig) {
int stat, pid;
while(1) {
if ((pid = waitpid(0, &stat, WNOHANG)) > 0) {
kill(pid, SIGKILL);
} else
break;
}
signal(SIGCHLD, &child_signal);
}
int main(int argc, char **argv) {
signal(SIGCHLD, child_signal);
...
return 0;
}
alarm
定義
#include <unistd.h>
unsigned int alarm(unsigned int seconds);
用法(10秒後結束行程)
void alarm_func(int signal)
{
printf("alarm\n");
exit(0);
}
int main(int argc, char **argv) {
alarm(10); // 設定 10 秒後送出 SIGALRM
signal(SIGALRM, alarm_func);
while(1)
sleep(1);
}
取消 alarm
alarm(0); // 設定為0,即可取消
沒有留言:
張貼留言