Linux編程中的中斷信號和一些標識(sig uid gid pid)

先上代碼:

#include <sys/wait.h>
#include <signal.h>
#include <stdio.h>
#include <stdlib.h>

char *buf;

// 自己定義一箇中斷的處理函數,在main中設定中斷進入的條件,並且在中斷中處理後事(free等等)退出程序
static void sig_int(int signo)
{
    // 在錯誤的時候輸出當前程序運行的用戶和用戶組標識還有進程pid,分別使用getuid()和getgid()來獲取
    // ID爲0的是根用戶和超級用戶
    printf("interrupt by uid:%d gid:%d process:%d\n", getuid(), getgid(), getpid());
    free(buf);
    exit(0);
}

int main(void)
{
    // 我們的中斷處理主要是靠signal這個函數來綁定的,將中斷信號和中斷處理函數綁定在一起
    // 我們一般使用ctrl+c來模擬SIGINT中斷信號,當程序運行中我們按下ctrl+c,它就會自動跳轉到函數執行sig_int
    if (signal(SIGINT, sig_int) == SIG_ERR)
    {
        error("signal error");
    }

    int i='a';
    int len = 1;
    buf = (char *)malloc(1);
    buf[len-1] = 0;
    /*
    while (1)
    {  
        buf = (char *)realloc(buf, sizeof(buf)+1);
        buf[sizeof(buf)-1] = buf[sizeof(buf)-2];
        buf[sizeof(buf)-2] = i++;
        printf("running...\n");
        printf("%s%d\n", buf, sizeof(buf));
        sleep(1);
    } 
     * 嚴重錯誤,buf是個指針,不可以用sizeof的,沒注意到,不夠細心啊。
     * 還有在函數的傳參中,數組都是作爲指針形參傳遞的哦
     */

    while (1)
    {
        buf = (char *)realloc(buf, ++len);
        buf[len-1] = buf[len-2];
        buf[len-2] = i++;
        // 無限循環會越界會溢出會有不可打印字符會申請不到內存,不過這並不影響我們的實驗,管它呢
        printf("running...\n");
        printf("%s%d\n", buf, len);
        sleep(1);
    }

    return 0;
}

當然還有另一種產生信號的方法是調用kill函數,在一個進程中調用此函數就可以向另一個進程發送一個信號。

發佈了34 篇原創文章 · 獲贊 7 · 訪問量 5萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章