1.訊號通訊:
訊號(signal)機制是unix系統中最為古老的程序間通訊機制,很多條件可以產生乙個訊號:
(1)當使用者按某些按鍵時,產生訊號。
(2)硬體異常產生訊號:除數為0,無效的儲存訪問等等。這些情況通常由硬體檢測到,將其通知核心,然後核心產
生適當的訊號通知程序,例如,核心對正訪問乙個無效存
儲區的程序產生乙個sigsegv訊號。
(3)程序用kill函式將訊號傳送給另乙個程序。
(4)使用者可用kill命令將訊號傳送給其他程序。
2.訊號型別:
下面是幾種常見的訊號:
(1)sighup: 從終端上發出的結束訊號。
(2)sigint: 來自鍵盤的中斷訊號(ctrl-c)。
(3)sigkill:該訊號結束接收訊號的程序,殺死程序。
(4)sigterm:kill 命令發出的訊號。
(5)sigchld:子程序停止或結束時通知父程序。
(6)sigstop:來自鍵盤(ctrl-z)或除錯程式的停止執行訊號,暫停程序。
3.訊號處理:
當某訊號出現時,將按照下列三種方式中的一種進行處理:
(1)忽略此訊號:大多數訊號都按照這種方式進行處理,但有兩種訊號決不能被忽略,它們是:sigkill\sigstop。
這兩種訊號不能被忽略的原因是:
它們向超級使用者提供了一種終止或停止程序的方法。
(2)執行使用者希望的動作:
通知核心在某種訊號發生時,呼叫乙個使用者函式。在使用者函式中,執行使用者希望的處理。
(3)執行系統預設動作:
對大多數訊號的系統預設動作是終止該程序。
4.幾個有關訊號處理的函式:
(1)kill
函式功能:傳送訊號給指定的程序
函式的原型: int kill(pid_t pid, int sig);
函式的引數:傳送指給定的sig訊號給引數pid;
pid > 0: 程序號為pid的程序;
pid = 0; 把訊號傳給和目前程序同程序組的所有程序;
pid = -1, 把訊號給系統內所有的程序;
pid <0 ; 傳給程序組號為pid絕對值的所有程序;
返回值: 成功為0,出錯-1;
標頭檔案: #include
#include
(2) raise
函式的作用:向程序自身傳送乙個訊號;
函式的原型: int raise(int sig);
返回值:成功是0,出錯-1;
標頭檔案:#include
(3)alarm
函式的作用:設定鬧鐘訊號,scod時間後sogalrm訊號傳送給目前的程序;
函式的原型: unsigned int alarm(unsigned int sceconds);
返回值: 返回之前鬧鐘的剩餘秒數, 未設鬧鐘返回0;
(4) pause
函式的作用: 市當前程序掛起,直至捕獲到乙個訊號;
函式的原型:int pause(void)
標頭檔案: #include
(5)signal
函式的作用: 設定訊號處理方式
函式的原型:void ( * signal (int signum, void ( *handler ) (int) ) )(int)
這樣看函式很難理解,我們可以對其進行下面的操作,就容易理解
typedef void (*handler) (int) ) sighandler_t
signal (int signum, sighandler_t handler);
函式說明:signal()會依引數signum指定的訊號編號來設定該訊號的處理函式,當指定訊號到達時就會跳轉到引數
handler指定的函式執行。如果引數handler不是函式指
針,則必須是下列兩個常量之一:
sig_ign:忽略引數signum指定的訊號。
sig_dfl:將引數signum指定的訊號重設為核心預設的訊號處理方式。
返回值:返回先前的訊號處理函式,如果出錯則返回-1。
程序間通訊 訊號
關於訊號在程序間的通訊,這是乙個比較複雜的東西,本人不在這裡做過多的介紹.如果想系統的學習,請參考 unix環境高階程式設計這本書 我在這裡只展示幾個例子 用守護程序實現檔案的同步.由子程序1改乙個檔案,守護程序2,檢查到檔案已經改變,並通過訊號告訴給父程序,父程序實現輸出.程式有點複雜,但思路還是...
程序間通訊(訊號)
linux系統程序間通訊有很多種方式 較多使用的有訊號,管道以及system vipc。各種通訊方式各有優缺點。這部分主要就程序間通訊方式進行總結。1 訊號。訊號進行程序間通訊方式有一點需要明確 訊號只能通知,不能在程序間共享資料資源。也就是說訊號僅僅是告訴你一下某個事情發生了。而我們的程式則可以對...
程序間通訊 訊號
訊號 概念 訊號是在軟體層次上對中斷機制的一種模擬,它是比較複雜的通訊方式,用於通知程序有某事件發生,乙個程序收到乙個訊號與處理器收到乙個中斷請求效果上可以說是一致的。程序在接收到這個訊號以後,可以設定響應的處理動作 忽略或者呼叫函式進行處理。在linux下命令列 kill l 可以檢視linux下...