Linux 信號通信 .

 一、信號

  信號(signal)機制是Unix進程間通信的一種機制。很多條件可以產生信號。

  進程可以用kill 函數將信號發送給另一個進程,用戶可以用kill命令發送信號。

  信號有三種處理方式:

1、忽略信號。通常情況下都按這種方式進行處理,但SIGKILL和SIGSTOP不能被忽略。

2、執行用戶定義的動作。調用用戶定義的函數,執行用戶希望的處理。

3、執行系統默認操作。通常爲終止該進程。

二、信號的發送

  頭文件爲<signal.h>

   int kill(pid_t pid, int signo)

pid參數:

pid>0:發送給進程ID爲pid的進程

pid==0: 發送給同組進程

pid<0:  發送給進程組ID等於pid絕對值的進程

pid == -1:  發送給所有進程

   int raise(int signo)       // 只能向自身發信號

   unsigned int alarm(unsigned int seconds)         //頭文件爲<unistd.h>

  經過sec秒後產生SIGALRM信號,後調用的alarm會更新先前的。如果後調用的sec爲0則取消先前的alarm。

   int pause()    將程序掛起,直到捕捉到一個信號。

 

三、信號的處理

   void (*signal(int signo, void (*func)(int)))(int)

啊..... 這個函數,有點微亂。就對付看吧,一般是看不懂。

就這麼理解吧:signal(signo, Func)

    Func 可以是

               SIG_IGN: 忽略此信號

               SIG_DFL:系統默認方式處理

               信號處理函數名: 使用該函數處理

四、舉例

  1. #include<stdio.h>   
  2. #include<signal.h>   
  3.   
  4. void receive(int sign){  
  5.         if(sign == SIGINT){  
  6.                 printf("Receive the SIGINT!!!\n");  
  7.         }  
  8. }  
  9.   
  10.    
  11.   
  12. main(){  
  13.         signal(SIGINT,receive);  
  14.         printf("waiting for the Mgs.....\n");  
  15.         pause();  
  16.   
  17. }  
#include<stdio.h>
#include<signal.h>

void receive(int sign){
        if(sign == SIGINT){
                printf("Receive the SIGINT!!!\n");
        }
}

 

main(){
        signal(SIGINT,receive);
        printf("waiting for the Mgs.....\n");
        pause();

}


 

  通過ps -aux命令找到相應的進程。以root權限,用 ps -s SIGINT PID號 命令即可向進程發送信號。

 

 

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