訊號是程序間通訊機制中唯一的非同步通訊機制。
訊號的分類:
根據可靠性:可靠訊號、不可靠訊號
根據與時間的關係:實時訊號、非實時訊號
程序可以通過下面三種方式來處理乙個訊號:
1. 忽略訊號
大多數訊號都按照這種方式進行處理,但有兩種訊號決不能被忽略,它們是:sigkill / sigstop。
這兩種訊號不能被忽略的原因是:它們向超級使用者提供了一種終止或停止程序的方法
2. 捕捉訊號
通知核心在某種訊號發生時,呼叫乙個使用者函式。在使用者函式中,執行使用者希望的處理
3. 執行預設操作
對大多數訊號的系統預設動作是終止該程序
傳送訊號的主要函式有 kill 和 raise
區別:kill 既可以向自身傳送訊號,也可以向其他程序傳送訊號。與 kill 函式不同的是,raise 函式是向程序自身傳送訊號。
1. kill
函式的作用:傳送訊號給指定的程序示例:函式的原型:int kill(pid_t pid,int sig);
引數:pid 引數有四種不同的情況:
pid>0:將訊號傳送給程序id為pid的程序。
pid == 0:將訊號傳送給同組的程序。
pid < 0:將訊號傳送給其程序組id等於pid絕對值的程序。
pid ==-1:將訊號傳送給所有程序。
標頭檔案:#include
#include
返回值:成功——返回0;錯誤——返回-1.
#include #include #include #include #include int main()
if (pid == 0)
else
else
}}
執行結果:
pid = 19218
kill 19218!
2. raise
函式的作用:傳送訊號給自身示例:函式的原型:
int raise(int sig);
標頭檔案:
#include
#include #include #include #include #include #include #include #include #include int main()
if (pid == 0)
else
waitpid(pid, null, 0);
exit(0);
}}
執行結果:
child (pid:10220) is waiting for any signal
parent kill child process 10220
3. alarm
函式的作用:設定訊號傳送鬧鐘示例:函式的原型:
unsigned int alarm(unsigned int seconds);
標頭檔案:
#include
返回值:返回之前鬧鐘的剩餘秒數,如果之前為設鬧鐘則返回。
#include #include #include void handler()
int main()
return 0;
}
執行結果:
sleep 1 ...
sleep 2 ...
sleep 3 ...
sleep 4 ...
sleep 5 ...
hello
sleep 6 ...
4. pause
函式的作用:讓程序暫停直到訊號出現函式的原型:
int pause(void);
標頭檔案:
#include
返回值:
-1
5. signal
函式的作用:設定訊號處理方式
函式的原型:
void (*signal(int signum,void(* handler)(int)))(int);
標頭檔案:
#include
返回值:
返回先前的訊號處理函式指標,如果有錯誤則返回
sig_err(-1
)。
程序通訊 訊號
程序通訊 訊號 產生訊號的條件 1 當使用者按某些按鍵時,產生訊號 2 硬體異常產生訊號 除數為0 無效的儲存訪問等等。這些情況通常由硬體檢測到,將其通知核心,然後核心產生適當的訊號通知程序,例如,核心對正訪問乙個無效儲存區的程序產生乙個sigsegv訊號 3 程序用kill函式將訊號傳送給另乙個程...
Linux程序通訊 訊號通訊
訊號 signal 機制是unix系統中最為古老的程序間通訊機制,很多條件可以產生乙個訊號 1 當使用者按某些按鍵時,產生訊號 2 硬體異常產生訊號 除數為0 無效的儲存訪問等等。這些情況通常由硬體檢測到,將其通知核心,然後核心產生適當的訊號通知程序,例如 核心對正訪問乙個無效儲存區的程序產生乙個s...
程序間通訊 訊號
關於訊號在程序間的通訊,這是乙個比較複雜的東西,本人不在這裡做過多的介紹.如果想系統的學習,請參考 unix環境高階程式設計這本書 我在這裡只展示幾個例子 用守護程序實現檔案的同步.由子程序1改乙個檔案,守護程序2,檢查到檔案已經改變,並通過訊號告訴給父程序,父程序實現輸出.程式有點複雜,但思路還是...