信號

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);
    }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章