訊號的逐步處理

2021-10-10 22:23:51 字數 1134 閱讀 9137

一、訊號

1、什麼是訊號?

訊號是乙個軟體中斷,通知程序發生了某個事件,打斷當前程序的當前操作,去處理這個事件;

2、linux下的訊號分類:

1~31號訊號:非可靠訊號(有可能產生訊號丟失)

34~64號訊號:可靠訊號(不會丟失)

3、訊號的生命週期:

產生–>註冊–>銷毀–>處理

(1)硬體產生:ctrl+c 中斷; ctrl+z 暫停; ctrl+\ 退出;

軟體產生:使用kill命令

int kill(pid_t pid, int dignum); //給指定的程序傳送指定的訊號

int raise(int signum); //給程序自身傳送指定的訊號

void abort(); //給程序自身傳送sigabrt訊號

int alarm(int sec); //定時器:sec秒之後給程序自身傳送sigalrm訊號

(2)訊號註冊

在程序的pcb中有乙個表(位圖)–>未決(沒有被處理)訊號的集合,訊號在程序中註冊,實際上就相等於修改這個圖,將對應的訊號位置為1;

非可靠訊號的註冊:如果訊號已經註冊(還沒有被註冊),則什麼都不做;若沒有註冊,則進行註冊;

可靠訊號的註冊:不管訊號是否已經存在,都會註冊一次(新增乙個訊號結點);

(3)訊號的登出

消除訊號在pcb中的痕跡,防止被重複處理;

(4)訊號的處理:處理乙個事件,相當於完成乙個功能;

本質原理:就是呼叫訊號的函式,執行這個函式,訊號什麼時候處理,由程序察覺到自己受到了某個訊號的時候才去處理;其處理方式是多種的、可修改的;

方法一:

預設處理方式:沒有特殊指定時採用的:sig_dfl

方法二:

忽略處理方式:針對這個事件,處理方式就是什麼都不做:sig_ign

方法三:

自定義處理方式:自己定義乙個處理函式作為指定的事件處理函式

使用介面:

sighandler_t signal(int signum, sighandler_t handler);

4、訊號的阻塞

int signprocmask(int how, const sigset_t *set, sigset_t *oldeset);

訊號處理,訊號佇列

最近幾天在看訊號,對實時訊號的實時性不是很理解,今天看了下 dequeue signal 差不多理解了,乙個實時訊號可以有多個實時佇列,在signal集合裡乙個signal可能有多個signal佇列。訊號,有訊號佇列,有訊號集 sigpending是訊號pending的結構體,裡面有sigqueue...

Linux的訊號處理

linux為實現訊號處理提供了比較多的介面,看似紛雜,但理清訊號的關係後還是很有條理的。主要分為以下四組,怎麼傳送乙個訊號,收到乙個訊號後做什麼樣的處理,主動等待乙個訊號的發生,對特定訊號只記錄是否發生供以後再處理 四組的api如下 不考慮多執行緒 傳送訊號 kill,alarm,arise 安裝訊...

Linux程序訊號 訊號處理

一 訊號相關概念 1.實際執行訊號的處理動作稱為訊號遞達 delivery 2.訊號從產生到遞達之間的狀態稱為訊號未決 pending 不一定會立即delivery 3.程序可以選擇阻塞 block 某個訊號。不會遞達 4.被阻塞的訊號產生時將保持在未決狀態,知道程序解除對此訊號 的阻塞,才會執行遞...