比如我們按下了鍵盤或者其它硬體故障)
;軟體**,最常用傳送訊號的系統函式是kill,raise, alarm
和setitimer
以及sigqueue
函式,軟體**還包括一些非法運算等操作。
程序可以通過三種方式來響應乙個訊號:(1
)忽略訊號,即對訊號不做任何處理,其中,有兩個訊號不能忽略:sigkill
及sigstop
;(2)捕捉訊號。定義訊號處理函式,當訊號發生時,執行相應的處理函式;(3
)執行預設操作,linux
對每種訊號都規定了預設操作,詳細情況請參考[2]
以及其它資料。注意,程序對實時訊號的預設反應是程序終止。
傳送訊號的主要函式:kill()
、raise()
、sigqueue()
、alarm()
、setitimer()
以及abort()。
1 , kill()
#include #include int kill(pid_t pid,int signo)
引數pid
的值訊號的接收程序
pid>0
程序id
為pid
的程序
pid=0
同乙個程序組的程序
pid<0 pid!=-1
程序組id
為-pid
的所有程序
pid=-1
除傳送程序自身外,所有程序id
大於1的程序
sinno
是訊號值,當為0
時(即空訊號),實際不傳送任何訊號,但照常進行錯誤檢查,因此,可用於檢查目標程序是否存在,以及當前程序是否具有向目標傳送訊號的許可權(root
許可權的程序可以向任何程序傳送訊號,非root
許可權的程序只能向屬於同乙個session
或者同乙個使用者的程序傳送訊號)。
kill()
最常用於pid>0
時的訊號傳送,呼叫成功返回0
;否則,返回-1
。注:對於pid<0
時的情況,對於哪些程序將接受訊號,各種版本說法不一,其實很簡單,參閱核心原始碼kernal/signal.c
即可,
2,alarm():
#include unsigned int alarm(unsigned int seconds)
專門為sigalrm
訊號而設,在指定的時間
seconds
秒後,將向程序本身傳送
sigalrm
訊號,又稱為鬧鐘時間。程序呼叫
alarm
後,任何以前的
alarm()
呼叫都將無效。如果引數
seconds
為零,那麼程序內將不再包含任何鬧鐘時間。
返回值,如果呼叫alarm
()前,程序中已經設定了鬧鐘時間,則返回上乙個鬧鐘時間的剩餘時間,否則返回0。
3, raise():
#include int raise(int signo)
向程序本身傳送訊號,引數為即將傳送的訊號值。呼叫成功返回
0;否則,返回-1。
4,abort();
#include void abort(void);
向程序傳送sigabort訊號,預設情況下程序會異常退出,當然可定義自己的訊號處理函式。即使sigabort被程序設定為阻塞訊號,呼叫abort()後,sigabort仍然能被程序接收。該函式無返回值。
向程序傳送sigabort訊號,預設情況下程序會異常退出,當然可定義自己的訊號處理函式。即使sigabort被程序設定為阻塞訊號,呼叫abort()後,sigabort仍然能被程序接收。該函式無返回值。
Linux通訊之訊號
a給b傳送訊號,b收到訊號之前執行自己的 收到訊號之後,不管執行到程式的什麼位置,都要暫停執行,去處理訊號,處理完畢再繼續執行。與硬體中斷類似 非同步模式。但訊號是軟體層面上實現的中斷,早期常被稱為 軟中斷 訊號的特質 由於訊號是通過軟體方法實現,其實現手段導致訊號有很強的延時性。但對於使用者來說,...
Linux通訊之訊號(二)
訊號捕捉 訊號捕捉特性 核心實現訊號捕捉過程 核心通過讀取未決訊號集來判斷訊號是否應被處理,訊號遮蔽字 mask 可以影響未決訊號集。而我們可以在應用程式中自定義 set 來改變 mask。以達到遮蔽指定訊號的目的。sigset t set typedef unsigned long sigset ...
linux程序間通訊之訊號
1 wait 函式 原型 pid t wait int status 子程序退出時,它向父程序傳送乙個sigchld訊號,預設情況是總是忽略sigchld訊號,此時程序狀態一直保留在記憶體中,因此需要父程序去處理改訊號,處理的辦法則是呼叫wait 函式,收集子程序狀態資訊,並清空該資訊 使用wait...