程序通訊 訊號

2021-07-24 00:00:11 字數 2340 閱讀 9239

訊號是程序間通訊機制中唯一的非同步通訊機制。

訊號的分類:

根據可靠性:可靠訊號、不可靠訊號

根據與時間的關係:實時訊號、非實時訊號

程序可以通過下面三種方式來處理乙個訊號:

1. 忽略訊號

大多數訊號都按照這種方式進行處理,但有兩種訊號決不能被忽略,它們是:sigkill / sigstop。

這兩種訊號不能被忽略的原因是:它們向超級使用者提供了一種終止或停止程序的方法

2. 捕捉訊號

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

3. 執行預設操作

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

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

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

1. kill

函式的作用:傳送訊號給指定的程序

函式的原型:int kill(pid_t pid,int sig);

引數:pid 引數有四種不同的情況:

pid>0:將訊號傳送給程序id為pid的程序。

pid == 0:將訊號傳送給同組的程序。

pid < 0:將訊號傳送給其程序組id等於pid絕對值的程序。

pid ==-1:將訊號傳送給所有程序。

標頭檔案:#include

#include

返回值:成功——返回0;錯誤——返回-1.

示例:

#include #include #include #include #include int main()

if (pid == 0)

else

else

}}

執行結果:

pid = 19218

kill 19218!

2. raise

函式的作用:傳送訊號給自身

函式的原型:

int raise(int sig);

標頭檔案:

#include

示例:

#include #include #include #include #include #include #include #include #include int main()

if (pid == 0)

else

waitpid(pid, null, 0);

exit(0);

}}

執行結果:

child (pid:10220) is waiting for any signal

parent kill child process 10220

3. alarm

函式的作用:設定訊號傳送鬧鐘

函式的原型:

unsigned int alarm(unsigned int seconds);

標頭檔案:

#include

返回值:返回之前鬧鐘的剩餘秒數,如果之前為設鬧鐘則返回。

示例:

#include #include #include void handler()

int main()

return 0;

}

執行結果:

sleep 1 ...

sleep 2 ...

sleep 3 ...

sleep 4 ...

sleep 5 ...

hello

sleep 6 ...

4. pause

函式的作用:讓程序暫停直到訊號出現

函式的原型:

int pause(void);

標頭檔案:

#include

返回值:

-1

5. signal

函式的作用:

設定訊號處理方式

函式的原型:

void (*signal(int signum,void(* handler)(int)))(int);

標頭檔案:

#include

返回值:

返回先前的訊號處理函式指標,如果有錯誤則返回

sig_err(-1

)。

程序通訊 訊號

程序通訊 訊號 產生訊號的條件 1 當使用者按某些按鍵時,產生訊號 2 硬體異常產生訊號 除數為0 無效的儲存訪問等等。這些情況通常由硬體檢測到,將其通知核心,然後核心產生適當的訊號通知程序,例如,核心對正訪問乙個無效儲存區的程序產生乙個sigsegv訊號 3 程序用kill函式將訊號傳送給另乙個程...

Linux程序通訊 訊號通訊

訊號 signal 機制是unix系統中最為古老的程序間通訊機制,很多條件可以產生乙個訊號 1 當使用者按某些按鍵時,產生訊號 2 硬體異常產生訊號 除數為0 無效的儲存訪問等等。這些情況通常由硬體檢測到,將其通知核心,然後核心產生適當的訊號通知程序,例如 核心對正訪問乙個無效儲存區的程序產生乙個s...

程序間通訊 訊號

關於訊號在程序間的通訊,這是乙個比較複雜的東西,本人不在這裡做過多的介紹.如果想系統的學習,請參考 unix環境高階程式設計這本書 我在這裡只展示幾個例子 用守護程序實現檔案的同步.由子程序1改乙個檔案,守護程序2,檢查到檔案已經改變,並通過訊號告訴給父程序,父程序實現輸出.程式有點複雜,但思路還是...