接收Ctrl+C的訊號中斷程式的執行
#include <stdio.h>
#include <stdlib.h>
#include <signal.h>
void proc_term_signal(int signal)
{
if (SIGINT == signal) {
printf("signal(%d) is SIGINT\n", signal);
} else {
printf("signal(%d) is not SIGINT\n", signal);
}
printf("exit by signal\n");
exit(1);
}
int main(int argc, char** argv)
{
printf("main start\n");
if (SIG_ERR == signal(SIGINT, proc_term_signal)) {
printf("An error occurred while setting a SIGINT handler.\n");
return 0;
}
printf("main wait 180 sec\n");
sleep(180);
printf("main end\n");
return 0;
}
如果希望恢復預設訊號處理,signal的第二個參數要使用SIG_IGN,直接忽略訊號用SIG_DFL。
在程式中發送指定訊號則是用raise函數;透過指令做訊號發送則是用kill來處理,
例如測試發送SIGUSR1訊號給PID為4771的執行程序
$ kill -USR1 4771
處理signal的流程建議多參考gnu libc手冊
https://www.gnu.org/software/libc/manual/html_node/Termination-in-Handler.html#Termination-in-Handler
留言