Linux中的程序訊號

2021-08-18 22:57:49 字數 1623 閱讀 2696

訊號概念訊號:系統為了響應某些狀況而產生的事件,程序收到訊號需要採取相應的動作。

訊號產生訊號產生的條件:

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...