訊號概念及訊號程式設計實戰1

2021-10-08 17:28:02 字數 1630 閱讀 7081

1相關概念:

軟中斷訊號(signal,簡稱為訊號)用來通知程序發生了非同步事件。程序之間可以互相通過系統呼叫kill傳送軟中斷訊號。核心也可以因為內部事件而給程序傳送訊號,通知程序發生了某個事件。注意,訊號只是用來通知某程序發生了什麼事件,並不給該程序傳遞任何資料。

收 到訊號的程序對各種訊號有不同的處理方法。處理方法可以分為三類:

第一種是類似中斷的處理程式,對於需要處理的訊號,程序可以指定處理函式,由該函式來處理。

第二種方法是,忽略某個訊號,對該訊號不做任何處理,就象未發生過一樣。

第三種方法是,對該訊號的處理保留系統的預設值,對大部分的信 號的預設操作是使得程序終止。此方法為預設操作。程序通過系統呼叫signal來指定程序對某個訊號的處理行為。

在程序表的表項中有乙個軟中斷訊號域,該域中每一位對應乙個訊號,當有訊號傳送給程序時,對應其位置位。由此可以看出,程序對不同的訊號可以同時保留,但對於同乙個訊號,程序並不知道在處理之前來過多少個。

訊號型別

發出訊號的原因很多,這裡按發出訊號的原因簡單分類,以了解各種訊號:

(1) 與程序終止相關的訊號。當程序退出,或者子程序終止時,發出這類訊號。

(2) 與程序例外事件相關的訊號。如程序越界,或企圖寫乙個唯讀的記憶體區域(如程式正文區),或執行乙個特權指令及其他各種硬體錯誤。

(3) 與在系統呼叫期間遇到不可恢復條件相關的訊號。如執行系統呼叫exec時,原有資源已經釋放,而系統資源又已經耗盡。

(4) 與執行系統呼叫時遇到非**錯誤條件相關的訊號。如執行乙個並不存在的系統呼叫。

(5) 在使用者態下的程序發出的訊號。如程序呼叫系統呼叫kill向其他程序傳送訊號。

(6) 與終端互動相關的訊號。如使用者關閉乙個終端,或按下break鍵等情況。

2訊號初級api signal與kill的介紹

signal原型:typedef void (*sighandler_t)(int);

sighandler_t signal(int signum, sighandler_t handler);

kill原型:int kill(pid_t pid, int sig);

通過輸入ps -aux|grep a.out 可以查詢相關應用程式的pid號。

3signal與kill相關程式設計的實戰

signal:

#include

#include

void handler(int signum)

printf(「never quit\n」);

}int main()

可以看到這是乙個while(1)死迴圈,在linux跑起來之後,將不會退出,平時我們可以按ctrl+c退出此類死迴圈,但是此時無法退出,因為按下ctrl+c後,將會給核心傳遞相關指令,使得不能直接退出,這個時候我們就需要使用kill指令了。可以直接kill-9加程序id號來殺死程序。我們也可以自己實現kill命令的程式設計。

2kill命令的程式設計實現:

#include

#include

#include

int main(int argc,char **ar**)

用此**即可實現kill命令的實現,這裡我們有兩種方式去實現kill命令,一是直接呼叫kill api來實現,二是通過system命令來間接呼叫kill命令,如此就完成了訊號的傳遞。

liunx訊號概念及c訊號函式的使用

liunx訊號機制是程序之間相互傳遞訊息的一種方法,訊號全稱為軟中斷訊號,也有人稱作軟中斷。從它的命名可以看出,它的實質和使用很象中斷。所以,訊號可以說是程序控制的一部分。linux 下的訊號可以模擬於dos下的int或者是windows下的事件.在有乙個訊號發生時候相信的訊號就會傳送給相應的程序....

訊號的基本概念及產生方式

通俗一點說,訊號一般做提醒工作,提醒之後會產生一系列的動作,比如紅綠燈 過馬路見到紅燈亮了,提醒自己應該停止過馬路,或者聽到鬧鐘響了,或許很多人的動作是關掉鬧鐘後接著睡吧,但接著睡也是一種動作吧。在計算機中,訊號是由作業系統發出的。首先先看一下計算機中的訊號吧。1 sighup 2 sigint 3...

訊號相關概念

我記得我在程序間通訊的時候說到過一種方式 訊號量 終止在linux命令列上正在執行的可執行程式所用的ctrl c,也屬於一種訊號 是常見sigint訊號 所以,今天我想具體分享一下與訊號相關的一些概念。linux中訊號共有64個,常見訊號量只有31個,利用kill l命令就可以用來檢視全部訊號,如下...