Linux程序通訊 訊號通訊

2021-09-02 10:36:32 字數 1780 閱讀 1042

訊號(signal)機制是unix系統中最為古老的程序間通訊機制,很多條件可以產生乙個訊號:

1、當使用者按某些按鍵時,產生訊號

2、硬體異常產生訊號:除數為0、無效的儲存訪問等等。這些情況通常由硬體檢測到,將其通知核心,然後核心產生適當的訊號通知程序,例如:核心對正訪問乙個無效儲存區的程序產生乙個sigsegv訊號。

3、程序用kill函式將訊號傳送給另乙個程序

4、使用者可用kill命令將訊號傳送給其他程序

下面是常見的幾種訊號型別:

訊號處理:

當某訊號出現時,將按照下列三種方式中的一種進行處理:

1、忽略此訊號

大多數訊號都按照這種方式進行處理,但有兩種訊號決不能被忽略。sigkill和sigstop。這兩種訊號不能被忽略的原因是:他們想超級使用者提供了一種終止或停止程序的方法。

2、執行使用者希望的動作

通知核心在某種訊號發生時,呼叫乙個使用者函式。在使用者函式中,執行使用者希望的處理。

3、執行系統預設動作

對大多數訊號的系統預設動作是終止該程序。

訊號傳送

傳送訊號的主要函式有kill和raise。

區別:kill既可以向自身傳送訊號,也可以像其他程序傳送訊號。與kill函式不同的是,raise函式是向程序自身傳送訊號。

#include

#include

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:將訊號傳送給所有的程序

pause函式使呼叫程序掛起直至捕捉到乙個訊號。

#include

int pause(void)

只有執行乙個訊號處理函式後,掛起才結束。

訊號處理

#include

void(*signal(intsigno,void(*func)(int)))(int)(函式指標)

不太懂可以參考這篇文章:

func可能的值是:

1、sig_ign:忽略此訊號

2、sig_dfl:按系統預設方式處理

3、訊號處理函式名:使用該函式處理

#include #include #include void my_func(int sign_no)

int main()

在linux上有:

先開乙個終端執行**:

開另乙個終端傳送訊號:

使用ps aux檢視程序號

signal已經在執行了

使用kill命令傳送 kill -s sigint +pid

Linux程序通訊 訊號

1.程序 在介紹訊號的概念之前,先簡單的介紹一下程序的概念 程序可以理解為一段正在執行的程式,它包括以下三個部分內容 1 一段正在執行的程式 2 與該段程式相關聯的全部資料 資料空間,記憶體,緩衝區 3 程式計數器 pc 2.訊號 可以這麼理解訊號,訊號本身不是訊息,它表達的內容才是訊息。linux...

Linux 程序通訊 訊號

linux 程序通訊 訊號 模擬 乙個程序收到訊號與乙個處理器收到乙個中斷請求可以說一樣的,訊號是非同步的,乙個程序不必通過任何操作來等待訊號的到達,事實上,程序也不知道訊號是什麼時候到達。常見訊號 sighup 從終端發出的訊號 sigint 來自鍵盤中斷訊號 sigkill 訊號結束接受訊號程序...

linux程序通訊 訊號

1.訊號的分類,常用的幾種訊號 訊號的分類 可靠性方面 可靠訊號和不可靠訊號 與時間上的關係 實時訊號與非實時訊號 常見的訊號 sighup 從終端上發出的結束訊號 sigint 來自鍵盤的中斷訊號 ctrl c sigkill 該訊號結束接收訊號的程序,殺死程序 sigterm kill 命令發出...