1. 程式人生 > >Linux 進程間通信 --信號

Linux 進程間通信 --信號

處理信號 sigstop lib 定義 har light 自己 種類 kill

  一、 信號是在軟件層次上對中斷機制的一種模擬,在原理上,一個進程收到一個信號與處理器收到一個中斷請求可以說是一樣的。信號是異步的,一個進程不必通過任何操作來等待信號的到達,事實上,進程也不知道信號到底什麽時候到達。

二、信號的種類     信號的名稱是在頭文件signal.h中定義的,信號都以SIG開頭     命令行輸入 kill -l 即可查看所有的信號     技術分享

三、進程對信號的響應

  進程可以通過三種方式來響應一個信號:

(1)忽略信號,即對信號不做任何處理,其中,有兩個信號不能忽略:SIGKILL及SIGSTOP;

(2)捕捉信號。定義信號處理函數,當信號發生時,執行相應的處理函數;

(3)執行缺省操作,Linux對每種信號都規定了默認操作。註意,進程對實時信號的缺省反應是進程終止。

  Linux究竟采用上述三種方式的哪一個來響應信號,取決於傳遞給相應API函數的參數。

四、信號的發送

  發送信號的主要函數有:kill()、raise()、 sigqueue()、alarm()、setitimer()以及abort()。

  kill (int pid ,int signl) 既可以向自身發送信號,也可以向別的進程發送信號

  raise(int signl) 只能向進程本身發送信號。

  alarm() 在指定的時間之後發送給自己 一個 SIGALRM的信號,如果不捕捉此信號,默認是終止該進程。

      unsigned int alarm(unsigned int seconds); // 在多少秒之後

  pause() 使進程掛起直至捕捉到一個信號。

五、信號的處理

  sighandler_t signal(int signum, sighandler_t handler);

signal(SIGINT, my_func);

  第一個參數指定信號的值,

  第二個參數指定針對前面信號值的處理,可以忽略該信號(參數設為SIG_IGN)可以采用系統默認方式處理信號(參數設為SIG_DFL);也可以自己實現處理方式(參數指定一個函數地址)my_func()。

  如果signal()調用成功,返回最後一次為安裝信號signum而調用signal()時的handler值;失敗則返回SIG_ERR。

  

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

void my_func(int sign_no)
{
    if(sign_no==SIGINT)
        printf("I have get SIGINT\n");
    else if(sign_no==SIGQUIT)
        printf("I have get SIGQUIT\n");
}
int main()
{
    printf("Waiting for signal SIGINT or SIGQUIT \n ");
    
    /*註冊信號處理函數*/
    signal(SIGINT, my_func);
    signal(SIGQUIT, my_func);
    
    pause();
    exit(0);
}

Linux 進程間通信 --信號