訊號是程序間通訊機制中唯一的非同步通訊機制,linux系統產生訊號以響應某些條件,當乙個程序接收(捕獲)到乙個訊號會採取相應的行動。其**有兩種:一,硬體,如按下鍵盤或者硬體故障。二,軟體,呼叫傳送訊號的函式(kill,alarm,raise)。
訊號的種類有以下:
1.響應訊號的函式
2.傳送訊號的函式#include //捕獲sig型別的訊號,並呼叫func函式
void (*signal(int sig, void (*func)(int)) )(int);
//signal函式的公升級版
int sigaction(int sig, const struct sigaction *act, struct sigaction *oact);
下面寫乙個使用訊號完成兩個程序間通訊的例子,在linux終端下分別touch兩個c檔案:signal_recv.c和signal_send.c。顧檔名思意,前者捕獲訊號,後者傳送訊號,實現如下:#include #include //向目標pid傳送sig
int kill(pid_t pid, int sig);
//向本程序傳送乙個sig
int raise(int sig);
//seconds秒後傳送乙個sigalrm的訊號
unsigned int alarm(unsigned int seconds);
//程式掛起直到捕獲訊號
int pause(void);
signal_recv.c
signal_send.c#include #include #include #include void func(int arg)
int main()
獻上makefile檔案,內容如下:#include #include #include int main(int argc, char** ar**)
printf("ar**:%s\n", ar**[1]);
pid_t pid = atoi(ar**[1]);
kill(pid, sigalrm);
return 0;
}
開啟終端輸入make,編譯上面兩個c檔案,生成可執行檔案recv和send。all:recv send
.phony:all
cc=gcc
recv:recv.o
$(cc) -o $@ $<
send:send.o
$(cc) -o $@ $<
recv.o:signal_recv.c
$(cc) -c $< -o $@
send.o:signal_send.c
$(cc) -c $< -o $@
.phony:clean
clean:
rm recv send recv.o send.o
先執行recv,得到該程序的pid=9216。
在另乙個終端執行send,向recv程序傳送乙個訊號。
send程式向pid為9216的程序傳送乙個訊號,該程序捕獲到訊號後執行func函式,列印一行recv signal。
程序間通訊 訊號
關於訊號在程序間的通訊,這是乙個比較複雜的東西,本人不在這裡做過多的介紹.如果想系統的學習,請參考 unix環境高階程式設計這本書 我在這裡只展示幾個例子 用守護程序實現檔案的同步.由子程序1改乙個檔案,守護程序2,檢查到檔案已經改變,並通過訊號告訴給父程序,父程序實現輸出.程式有點複雜,但思路還是...
程序間通訊(訊號)
linux系統程序間通訊有很多種方式 較多使用的有訊號,管道以及system vipc。各種通訊方式各有優缺點。這部分主要就程序間通訊方式進行總結。1 訊號。訊號進行程序間通訊方式有一點需要明確 訊號只能通知,不能在程序間共享資料資源。也就是說訊號僅僅是告訴你一下某個事情發生了。而我們的程式則可以對...
程序間通訊 訊號
訊號 概念 訊號是在軟體層次上對中斷機制的一種模擬,它是比較複雜的通訊方式,用於通知程序有某事件發生,乙個程序收到乙個訊號與處理器收到乙個中斷請求效果上可以說是一致的。程序在接收到這個訊號以後,可以設定響應的處理動作 忽略或者呼叫函式進行處理。在linux下命令列 kill l 可以檢視linux下...