先上代碼:
#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函數,在一個進程中調用此函數就可以向另一個進程發送一個信號。