陳鍾誠

Version 1.0

訊號機制 – (signal) 攔截中斷訊號的處理機制

程式範例

    #include <signal.h>
    #include <stdio.h>
    #include <windows.h>

    void sigdump(int sig) {
        printf("catch a signal:%d\n", sig);
    }

    int main(int argc, void *argv[]) {
        signal(SIGABRT, &sigdump);    // Process abort signal.
        signal(SIGFPE, &sigdump);    // Erroneous arithmetic operation.
        signal(SIGILL, &sigdump);    // Illegal instruction.
        signal(SIGINT, &sigdump);    // Terminal interrupt signal. Ctrl-C
        signal(SIGSEGV, &sigdump);    // Invalid memory reference.
        signal(SIGTERM, &sigdump);    // Termination signal.
        int a=7, b=0, result;
        if (strcmp(argv[1], "FPE")==0)
          result = a/b;
        else if (strcmp(argv[1], "SEGV")==0) {
          * (int*) (10000) = 1;
        }
        Sleep(1000*10);
        return 0;
    }

執行結果

    D:\cp>gcc signal.c -o signal

    D:\cp>signal FPE
    catch a signal:8

    D:\cp>signal SEGV
    catch a signal:11

    D:\cp>signal
    catch a signal:11

    D:\cp>signal X     // 執行後請在 10 秒鐘內按下 Ctrl-C,就會出現 catch a signal:2 的訊息
    catch a signal:2  

來自 jserv 的建議

    => 這個案例不好,第一個因為 <windows.h>,另外沒有闡述 UNIX signal 和 Windows 對於 POSIX 的支援狀況

參考文獻