在之前的博文《linux程序間通訊(一)----初識篇》中,我們知道了程序間通訊主要分為三大類,分別是管道通訊,訊號通訊,以及ipc通訊;程序間通訊主要是為了不同程序之間的資料共享,訊號通訊也不例外。
(1)什麼是訊號通訊,或者說什麼是訊號機制?
訊號是軟體層次上對中斷機制的一種模擬,是一種非同步通訊方式。通常如果我們做過微控制器開發,嵌入式底層硬體開發,我們都很熟悉硬體中斷,它是外設工作時給cpu傳送的,是一種非同步通訊方式。
linux核心通過訊號通知程序,不同的訊號型別代表不同的事件,linux對早期的unix訊號機制進行了擴充套件。
(2)檢視當前linux下面支援的訊號型別
(3)程序對訊號的處理方式
預設方式
忽略訊號
捕捉訊號
(4)訊號的相關命令注意這是我們在console終端下可以輸入的命令
1. kill //英文原意是殺死,會讓我們中文使用者產生誤解,既然是殺死是不是意味著停止程序
//實際上是向乙個程序傳送訊號的意思
kill [
-signal] pid // 預設訊號是15 sigterm
-sig 可指定訊號
pid 指定傳送物件
舉例 kill -
96437
2. killall
killall [
-u user | prog]
prog 指定程序名,注意這裡是程序的名字,不是程序pid
user 指定使用者名稱
(5)訊號傳送函式
1. kill
#include
#include
intkill
(pid_t pid,
int sig)
; pid : 指定程序號 0代表同組程序;-
1代表所有除了init程序和當前程序之外的程序
sig : 訊號型別
2. raise
#include
#include
intraise
(int sig)
;3. alarm
intalarm
(unsigned
int seconds)
; seconds 定時器的時間
成功返回上個定時器的剩餘時間,失敗返回eof
經常用來實現超時檢測
4. pause
intpause
(void);
程序一直阻塞,直到而被訊號中斷
5. signal
設定訊號響應方式,請注意這個函式和kill、killall的區別,我們中文使用者會理解為
發訊號,實際上它並不是發訊號
#include
#include
void(*
signal
(int signo,
void
(*handler)
(int))
)(int)
成功返回原先的訊號處理函式,失敗返回sig_err
signo 要設定的訊號型別
handler 指定的訊號處理函式;sig_dfl代表預設方式;sig_ign代表忽略訊號
(1)alarm和pause讀者可以在自己的環境下編譯後執行看一下最後的效果,思考,如果將alarm函式注釋後再執行,會是什麼結果?
#include
"stdio.h"
#include
"stdlib.h"
#include
#include
"sys/types.h"
#include
intmain()
(2)傳送訊號signal編譯後執行,分別在console下按下"ctrl+c"和"ctrl+",以及其他任意組合鍵,看運**況
#include
"stdio.h"
#include
"stdlib.h"
#include
#include
"sys/types.h"
#include
void
handler
(int signo)
if(signo == sigquit)
}int
main()
Linux 程序間通訊 訊號
訊號是在軟體層次上對中斷機制的一種模擬,在原理上,乙個程序收到乙個訊號與處理器收到乙個中斷請求可以說是一樣的。訊號是非同步的,乙個程序不必通過任何操作來等待訊號的到達,事實上,程序也不知道訊號到底什麼時候到達。訊號是程序間通訊機制中唯一的非同步通訊機制,可以看作是非同步通知,通知接收訊號的程序有哪些...
Linux程序間通訊 訊號
1.什麼是訊號 訊號是linux系統響應某些條件而產生的乙個事件,接收到該訊號的程序會執行相應的操作。2.訊號的產生 1 由硬體產生,如從鍵盤輸入ctrl c可以終止當前程序 2 由其他程序傳送,如可在shell程序下,使用命令 kill 訊號標號 pid,向指定程序傳送訊號。3 異常,程序異常時會...
Linux程序間通訊 訊號
訊號 signals 是unix 類unix以及其他posix相容的作業系統中程序間通訊的一種有限制的方式。它是一種非同步的通知機制,用來提醒程序乙個事件已經發生。當乙個訊號傳送給乙個程序,作業系統中斷了程序正常的控制流程,此時,任何非原子操作都將被中斷。如果程序定義了訊號的處理函式,那麼它將被執行...