訊號概念訊號:系統為了響應某些狀況而產生的事件,程序收到訊號需要採取相應的動作。
訊號產生訊號產生的條件:
1、按下終端鍵-------->ctrl+c、ctrl+\
2、硬體異常----------->除零操作、無效記憶體
3、某些軟條件發生---->時間片到
4、管道破裂
用kill -l 可以檢視系統定義的訊號列表
訊號產生的方式:
1、通過終端鍵產生訊號
2、呼叫系統函式向程序傳送訊號
3、由軟體條件產生訊號
訊號處理
常見方式:------------->注意:sigkill,sigstop不能被執行2,3
1、預設處理,
2、忽略該訊號,即不做任何處理
3、捕獲並處理,即提供訊號處理函式
當訊號到達時,系統做了三件事:
儲存現場,轉去執行訊號處理程式,恢復現場。
訊號block,pending訊號在核心的表示:
訊號抵達(delivery):執行訊號處理動作稱之為訊號抵達.
從訊號產生到訊號抵達之間的狀態稱之為訊號未決(pending)
程序可以選擇阻塞(block)某個訊號。
被阻塞的訊號產生時保持未決狀態。 直到解除對此訊號的阻塞,才執行抵達動作。
訊號集操作函式:
呼叫函式sigprocmask可以讀取或更改程序的訊號遮蔽字
int sigprocmask(int how, // sig_block mask |= set
// sig_unblock mask &= ~set
// sig_setmask mask = set
const sigset_t *set, // 我們要設定訊號遮蔽
sigset_t *oldset); // 返回舊的訊號遮蔽訊號集:
sigpending:讀取當前程序的未決訊號集。
int sigpending(sigset_t *set)//返回未決訊號集
訊號捕捉:
sigaction:
int sigaction(int signum, // 要註冊的訊號
const struct sigaction *act, //是個結構體指標
struct sigaction *oldact);//返回舊的訊號,一般不用
act這個結構體:
struct sigaction ;
可重入函式與不可重入函式
不可重入函式的條件:1、使用了靜態區域性變數,2、使用了malloc,free函式,3、使用了標準io
那麼什麼叫做不可重入函式呢?
一般在訊號處理函式中,會使用我們自己定義的處理方法,但是不能放在訊號處理函式中的函式就叫做不可重入函式。不可重入函式是不安全的。
反之就叫做可重入函式。
Linux中的程序訊號
1 sighup終止程序 終端線路結束通話 本訊號在使用者終端連線 正常或非正常 結束時發出 通常是在終端的控制程序結束時,通知同一session內的各個作業 這時它們與控制終端不再關聯 2 sigint終止程序 中斷程序 程式終止 interrupt 訊號,在使用者鍵入intr字元 通常是ctrl...
linux程序中的訊號遮蔽
在linux的程序中可以接收到各種的訊號,並且如果你不對訊號進行處理,linux中的程序就會採用預設的處理方式處理,比如ctrl c的訊號,程序對它的處理就是終止程序的執行。在linux中,我們也可以在程序中遮蔽掉某些訊號,使程序不去處理這些訊號,但其中的sigkill和sigstop是不能被阻塞的...
Linux中的程序與訊號
kill命令 命令 kill 功能 向特定程序傳送某種訊號 格式 kill 選項 訊號名稱 編號 pid列表 選項 功能 l 列出系統中定義的訊號 linux系統中部分常用的訊號 編號 名稱 功能 快捷鍵 2 sitint 程式終止訊號,用於通知前台終止程序 ctrl c 3 sigquit 與si...