程序間通訊 訊號(signal)

2021-06-21 10:34:59 字數 1416 閱讀 9315

訊號(signal)機制是linux系統中最為古老的程序之間到通訊機制。linux訊號也可以稱為軟中斷,是在軟體層上對中斷機制到一種模擬。訊號是非同步的,它是程序間通訊機制中唯一的非同步通訊機制。

linux 系統中定義一系列到訊號,可以使用"kill -l"命令列出所有到訊號。

linux 的訊號機制是從unix繼承下來的,早期unix系統只定義了32種訊號,現在linux支援了64種訊號,而且將來進一步增加。

每個訊號都有各自的預設動作。如按鍵盤"ctrl ^ c"時,會產生sigint 訊號,對訊號的預設反映就是程序終止。前32種訊號暴露出主要的缺陷是訊號有可能丟失。這些訊號也稱為非實時訊號。後32種訊號是實時訊號,是 linux 經過改進和擴充原始之後的,支援訊號排隊,這保證了傳送的多個實時訊號都被接受。

訊號的安裝。主要有兩個函式:

#include

typedef void (*sighandler_t)(int);

sighandler_t  signal(int signum, sighandler_t handler);

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

sig_dfl 採用系統預設的方式處理訊號。

sig_ign 忽略訊號。

第二個引數是處理函式。

訊號的傳送,常用的傳送函式有 kill(),raise() , alarm(), setitimer, abort()等。

kill()是向指定的程序傳送訊號。

#include

#include

int kill(pid_t pid, int sig);

pid > 0,給pid為pid的程序傳送訊號

pid==0,給同乙個程序組的所有程序傳送訊號。

pid<0 且!=-1,給程序組id為pid的絕對值的所有程序傳送訊號。

pid ==-1 , 給除了自身之外的pid>1的程序傳送訊號

raise(),使用者給程序本身傳送乙個訊號

#include

int raise(int sig);

例子:

#include #include #include #include #include #include /*define a function pid_printf*/

void pid_printf(char *format, ...)

/*handle signal*/

void signal_hanler(int signo)

}int main(int argc, char *argv)

else if(pid!=-1)

else

return 0;

}

程序間通訊 訊號

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

程序間通訊(訊號)

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

程序間通訊 訊號

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