程序通訊—訊號
產生訊號的條件
1、當使用者按某些按鍵時,產生訊號
2、硬體異常產生訊號:除數為0、無效的儲存訪問等等。這些情況通常由硬體檢測到,將其通知核心,然後核心產生適當的訊號通知程序,例如,核心對正訪問乙個無效儲存區的程序產生乙個sigsegv訊號
3、程序用kill函式將訊號傳送給另乙個程序
4、使用者可用kill命令將訊號傳送給其他程序
下面是幾種常見的訊號:
sighup: 從終端上發出的結束訊號
sigint: 來自鍵盤的中斷訊號(ctrl-c)
sigkill:該訊號結束接收訊號的程序,殺死程序
sigterm:kill 命令發出的訊號
sigchld:子程序停止或結束時通知父程序
sigstop:來自鍵盤(ctrl-z)或除錯程式的停止執行訊號,暫停程序
處理訊號的三種方式
1、忽略此訊號
大多數訊號都按照這種方式進行處理,但有兩種訊號
決不能被忽略,它們是:
sigkill\sigstop。
這兩種訊號不能被忽略的原因是:
它們向超級使用者提供了一種終止或停止程序的方法
2、執行使用者希望的動作
通知核心在某種訊號發生時,呼叫乙個使用者函式。在使用者函式中,執行使用者希望的處理
3、執行系統預設動作
對大多數訊號的系統預設動作是終止該程序
函式kill
函式功能:傳送訊號給指定程序
函式原型:int kill(pid_t pid,int sig);
函式引數:pid:程序號 sig:訊號
返回值 :>0:將訊號傳送給程序號為pid的程序
=0:將訊號傳送給與當前程序相同程序組的所有程序
-1:將訊號廣播給系統內所有的程序
<0:將訊號傳送給與pid絕對值相同的程序
引數 :成功:0,;出錯:-1
標頭檔案 :
#include
#include
函式raise
函式功能:傳送訊號給本程序
函式原型:int raise(int signo);
函式引數:signo :訊號
返回值 :成功:0失敗:-1
標頭檔案 :
#include
#include
函式alarm
函式功能:設定訊號傳送鬧鐘
函式原型:unsigned int alarm(unsigned int seconds);
函式引數:seconds經過了指定的seconds秒後會產生訊號sigalrm。
返回值 :返回之前鬧鐘的剩餘秒數,如果之前未鬧鐘則返回0
標頭檔案 :
#include
注意:
每個程序只能有乙個鬧鐘時間.如果在呼叫alarm時,以前已為該程序設定過鬧鐘時間,而且它還沒有超時,以前登記的鬧鐘時間則被新值代換
如果有以前登記的尚未超過的鬧鐘時間,而這次seconds值是0,則表示取消以前的鬧鐘
函式pause
函式功能:讓程序暫停直到訊號出現
函式原型:int pause(void);
返回值 :-1
標頭檔案 :
#include
函式signal
函式功能:設定訊號處理方式
函式原型:void (signal (int signo, void ( sighandler_t)(int)))(int);
typedef void (*sighandler_t)(int) sighandler_t;
signal(int signum, sighandler_t handler));
函式引數:func可能的值是:
1、sig_ign:忽略此訊號
2、sig_dfl: 按系統預設方式處理
3、訊號處理函式名:使用該函式處理
標頭檔案 :#include
#include
#include
#include
/*自定義訊號處理函式*/
void my_func(int sign_no)
int main()
程序通訊 訊號
訊號是程序間通訊機制中唯一的非同步通訊機制。訊號的分類 根據可靠性 可靠訊號 不可靠訊號 根據與時間的關係 實時訊號 非實時訊號 程序可以通過下面三種方式來處理乙個訊號 1.忽略訊號 大多數訊號都按照這種方式進行處理,但有兩種訊號決不能被忽略,它們是 sigkill sigstop。這兩種訊號不能被...
Linux程序通訊 訊號通訊
訊號 signal 機制是unix系統中最為古老的程序間通訊機制,很多條件可以產生乙個訊號 1 當使用者按某些按鍵時,產生訊號 2 硬體異常產生訊號 除數為0 無效的儲存訪問等等。這些情況通常由硬體檢測到,將其通知核心,然後核心產生適當的訊號通知程序,例如 核心對正訪問乙個無效儲存區的程序產生乙個s...
程序間通訊 訊號
關於訊號在程序間的通訊,這是乙個比較複雜的東西,本人不在這裡做過多的介紹.如果想系統的學習,請參考 unix環境高階程式設計這本書 我在這裡只展示幾個例子 用守護程序實現檔案的同步.由子程序1改乙個檔案,守護程序2,檢查到檔案已經改變,並通過訊號告訴給父程序,父程序實現輸出.程式有點複雜,但思路還是...