linux之通訊之訊號學習1

2021-06-22 09:26:14 字數 1937 閱讀 5376

比如我們按下了鍵盤或者其它硬體故障)

;軟體**,最常用傳送訊號的系統函式是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...