程序間的通訊 訊號

2022-07-29 00:57:10 字數 2011 閱讀 2609

1、訊號本質

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

訊號是程序間通訊機制中唯一的非同步通訊機制,可以看作是非同步通知,通知接收訊號的程序有哪些事情發生了。訊號機制經過posix實時擴充套件後,功能更加強大,除了基本通知功能外,還可以傳遞附加資訊。

2、訊號**程序可以通過三種方式來響應乙個訊號:

linux究竟採用上述三種方式的哪乙個來響應訊號,取決於傳遞給相應api函式的引數。

如果程序要處理某一訊號,那麼就要在程序中安裝該訊號。安裝訊號主要用來確定訊號值及程序針對該訊號值的動作之間的對映關係,即程序將要處理哪個訊號;該訊號被傳遞給程序時,將執行何種操作。

linux主要有兩個函式實現訊號的安裝:signal()sigaction()

其中signal()在可靠訊號系統呼叫的基礎上實現,是庫函式。它只有兩個引數,不支援訊號傳遞資訊,主要是用於前32種非實時訊號的安裝;

sigaction()是較新的函式(由兩個系統呼叫實現:sys_signalsys_rt_sigaction),有三個引數,支援訊號傳遞資訊,主要用來與sigqueue()系統呼叫配合使用,當然,sigaction()同樣支援非實時訊號的安裝。sigaction()優於signal()主要體現在支援訊號帶有引數。

signal

typedef void (*sighandler_t)(int);

sighandler_t signal(int signum, sighandler_t handler));

第乙個引數指定訊號的值;

第二個引數指定針對前面訊號值的處理,

- 設為sig_ign:忽略該訊號

- 設為sig_dfl:採用系統預設方式處理訊號

如果signal()呼叫成功,返回最後一次為安裝訊號signum而呼叫signal()時的handler值;失敗則返回sig_err。

sigaction

int sigaction(int signum,const struct sigaction *act,struct sigaction *oldact));

sigaction函式用於改變程序接收到特定訊號後的行為。

第乙個引數 signum :訊號的值,可以是除sigkill及sigstop外的任何乙個特定有效的訊號

(因為這兩個訊號定義自己的處理函式,將導致訊號安裝錯誤)。

第二個引數 act: 指向結構sigaction的乙個例項的指標,在結構 sigaction的例項中,

指定了對特定訊號的處理,可以為空,程序會以預設方式對訊號處理。

第三個引數 oldact:指向的物件用來儲存原來對相應訊號的處理,可指定oldact為null。

如果把第

二、第三個引數都設為null,那麼該函式可用於檢查訊號的有效性。

第二個引數最為重要,其中包含了對指定訊號的處理、訊號所傳遞的資訊、訊號處理函式執行過程中應遮蔽掉哪些函式等等。

傳送訊號的主要函式有:kill()、raise()、sigqueue()、alarm()、setitimer()以及abort()。

鬧鐘:

#include#include#includevoid handler()

//延時5s 列印 hello

int main(void)

return 0;

}

訊號的設定:

#include #include #include #include #include void handler(int sig)

int main(void)

程序間通訊 訊號

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

程序間通訊(訊號)

linux系統程序間通訊有很多種方式 較多使用的有訊號,管道以及system vipc。各種通訊方式各有優缺點。這部分主要就程序間通訊方式進行總結。1 訊號。訊號進行程序間通訊方式有一點需要明確 訊號只能通知,不能在程序間共享資料資源。也就是說訊號僅僅是告訴你一下某個事情發生了。而我們的程式則可以對...

程序間通訊 訊號

訊號 概念 訊號是在軟體層次上對中斷機制的一種模擬,它是比較複雜的通訊方式,用於通知程序有某事件發生,乙個程序收到乙個訊號與處理器收到乙個中斷請求效果上可以說是一致的。程序在接收到這個訊號以後,可以設定響應的處理動作 忽略或者呼叫函式進行處理。在linux下命令列 kill l 可以檢視linux下...