程序間通訊 訊號程式設計

2021-09-24 11:15:40 字數 1880 閱讀 7210

訊號為linux提供了一種處理非同步事件的方法。
訊號的名字和編號

名字以『sig』開頭,例如『sigio』、『sigchld』等。

訊號都定義在『signal.h』標頭檔案中。訊號名都定義為正整數。具體的訊號名稱可以用kill -l來檢視。不存在0訊號,kill對於訊號0有特殊的應用。

訊號處理的方式

有三種:忽略、捕捉和預設動作

忽略:大多數訊號可用忽略方式來處理,但是sigkillsigstop是不能被忽略的;因為他們向核心和超級使用者提供了程序終止和停止的可靠方法。

捕捉:需告訴核心,使用者希望如何處理某一種訊號,說白了就是寫乙個訊號處理函式,然後將這個函式告訴核心(有點像中斷)。訊號產生時,由核心呼叫函式。

預設系統動作:對於每個訊號來說,系統都對應由預設的處理動作,當發生了該訊號,系統會自動執行。不過對系統來說,大部分處理方式都比較粗暴,即直接殺死該程序。

具體的訊號預設動作可以使用』man 7 signal』來檢視。

程式**

#include #include //      typedef void (*sighandler_t)(int); 

// 函式指標,沒有返回值,帶有乙個整型數的引數。

// sighandler_t signal(int signum, sighandler_t handler);

// 引數int signum:軟訊號 使用kill -l來檢視你要捕捉哪個訊號。

// 引數sighandler_t handler:函式指標,_t代表結構體的意思。

void handler(int signum)

printf("never qiut\n");

}int main()

程式執行時,使用ctrl+c無法停止程序,此時ps -aux|grep a.out檢視a.out執行下的pid ,再使用kill -9 pid號便可停止a.out程式,其餘signal指令同理。

程式**

為實現程式完成對訊號的傳送,可以使用kill函式

#include #include #include #include //      typedef void (*sighandler_t)(int);

// int kill(pid_t pid, int sig);

// sighandler_t signal(int signum, sighandler_t handler);

int main(int argc,char **ar**)//扔了兩個引數進去,為了傳遞訊號值與pid號

; signum=atoi(ar**[1]);//轉換:字串轉整型數(ask碼to整型)

pid=atoi(ar**[2]);//同上

printf("num=%d,pid=%d\n",signum,pid);

// kill(pid,signum); //使用kill函式,需要pid號與signum。也可以使用system函式,例子如下

sprintf(cmd,"kill -%d %d\n",signum,pid);//構造命令列引數,

//引數1為我們要構造的目標字串

//引數2為字串的長相

system(cmd);

printf("send signul ok\n");

return 0;

}~

程序間通訊 訊號

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

程序間通訊(訊號)

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

程序間通訊 訊號

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