接收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

留言