1、信號的種類
命令:kill -l (62個)
2、信號的來源:軟件、硬件
SIGINT(2號):Ctrl + C
Ctrl+\(3號) :SIGQUIT
SIGINT的默認處理動作是終止進程,而SIGQUIT的默認處理動作是終止進程並且Cor Dump
3、信號的產生
kill函數(給指定進程發信號)
int kill(pid_t pid, int sig);raise函數(自己給自己發信號)
int raise(int sig);
4、信號的處理
進程接收到一個信號後有三種處理方式:
1)默認處理,通常是強制結束
2)忽略處理
9號(SIGKILL)和19號(SIGSTOP即ctrl+z)這兩個信號不可忽略
3)自定義處理(軟件中斷(異步)有就處理)
#include <sys/types.h>
#include <signal.h>
#include <stdio.h>
#include <unistd.h>//函數的參數可以爲數據,也可以爲操作(函數指針)
void signal_handler(int signum) //回調函數
{
if(signum== SIGINT)
printf("hahahah\n");
else if(signum== SIGUSR2)
printf("你好,cmz\n"); //滿足條件時自動調用,不需要顯示調用
}
void main()
{
signal(SIGUSR1,SIG_IGN);//忽略SIGUSR1信號
signal(3,SIG_IGN);//忽略SIGQUIT信號,參數1可爲信號編號,通過kill -l查出
// typedef void (*sighandler_t)(int); 指定函數結構
// sighandler_t signal(int signum, sighandler_t handler);
//信號編號 函數名
signal(SIGINT,signal_handler);//即Ctrl+C信號//爲信號註冊處理函數
signal(SIGUSR2,signal_handler);//多個信號可以共用一個處理函數
while(1) //函數通過傳過來的參數判斷處理哪個信號
{ //想用幾個信號就註冊幾個singnal
printf("hello\n");
sleep(1);
}
}