linux_c開發(5-3)進程間通訊_信號通訊

信號通訊

信號(signal)機制是UNIX系統中最爲古老的進程間通信機制,有很多條件可以產生一個信號:
1、 當用戶按某些按鍵時,產生信號。
2、 硬件異常產生信號:除數爲零,無效的存儲訪問等等。這些信號通常有硬件檢測得到,將其通知內核,然後內核產生適當的信號通知進程,例如: 內核對正在訪問一個無效存儲區的進程產生一個SIGSEGV信號。
3、進程用kill函數將信號發送給另一個進程。
4、 用戶可以用kill命令將信號發送給其他進程。

信號類型

這裏寫圖片描述

幾種常見的信號

SIGHUP: 從終端發來的結束信號
SIGINT: 來自鍵盤的中斷信號(ctrl+c)
SIGKILL: 該信號結束接收信號的進程
SIGTERM: KILL命令發出的信號
SIGCHLD: 表示子進程停止或結束的信號
SIGSTOP: 來自鍵盤(ctrl+Z)或調試程序的停止執行信號

信號處理

當某信號出現時,將按下面三種方式中的一種處理:
1、忽略此信號
大多數信號都是按這種方式處理的,但有兩種信號不能被忽略。SIGKILL和SIGSTOP。這兩種信號不能被忽略的原意是他們向超戶提供了一種終止或停止進程的一種方法。
2、執行用戶希望的動作
通知內核在某種信號發生時,調用一個用戶函數。在用戶函數中,執行用戶希望的處理。
執行系統默認動作
對大多數信號的系統默認動作是終止該進程。

信號發送

發送信號的主要信號有kill和raise。
區別:
kill既可以向自身發送信號,也可以向其他進程發送信號。而raise函數是向進程自身發送信號。

#include(sys/types.h)
#include(signal.h)
int kill(pid_t pid,int signo)
int raise(int signo)

kill的pid參數有四種不同情況:
1、pid>0
將信號發送給進程ID爲pid的進程。
2、pid==0
將信號發送給同組進程。
3、pid<0
將信號發送給其進程組ID等於pid絕對值得進程。
4、pid==-1
將信號發送給所有進程。

Alarm
使用alarm函數可以設置一個時間值(鬧鐘時間),當到達所設定的時間,產生SIGALRM 信號。如果不捕捉此信號,則默認動作是終止該進程。

#include<unistd.h>
insigned int alarm(unsigned int seconds)

Seconds:經歷指定的秒數後會產生信號SIGALRM。

Pause
pause函數使調用函數掛起直至捕捉到一個信號。
#include<ubistd.h>
int pause(void)

只有執行了一個信號處理函數後,掛起才結束。

信號的處理

§當系統捕捉到某個信號時,可以忽略該信號或是使用指定的處理函數來處理該信號,或是使用系統默認的方式。
§§ 信號的處理方法主要有兩種,一種是使用簡單的signal函數,另一種是使用信號集函數組。

signal

#include<signal.h>
void(*signal(int signo,void(*func)(int)))(int)
//可以理解爲
//typedef void(*sighandler_t)(int)
//sighandler_t signal(int signum,sighandler_t handler)

Func可能是:
1、SIG_IGN:忽略此信號
2、SIG_DEL:按系統默認方式處理
3、信號處理函數名:使用該函數處理

#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);
}

程序運行結果
這裏我們運行起程序之後用kill給進程發送信息。格式爲:

 kill -s  信息  pid

進程號可以用:ps aux 查看
例如我查的我的進程號爲623 那麼我的發送信息格式爲:kill -s SIGQUIT 623

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章