Linux系统编程(四)信号
Linux系統編程(四)信號
- 一、什么是信號?
- 1、信號的本質
- 2、信號來源
- 硬件來源
- 軟件來源
- 二、常見信號
- 1.可靠信號和不可靠信號
- 2、不可靠信號主要有以下問題:
- 3、可靠信號與不可靠信號注冊機制
- 三、信號處理方式
- 四、信號處理過程
- 五、未決信號和阻塞信號
- 六、信號集操作函數
一、什么是信號?
1、信號的本質
信號在linux中又稱為軟中斷信號,用來通知進程發生了異步事件。進程收到信號必須停止,直到處理完信號后再執行下一條指令。
2、信號來源
硬件來源
終端按鍵產生信號 ,如(Ctrl + c ,Ctrl + z ,Ctrl+\)
硬件異常產生信號, 如(除0操作,非法訪問內存(段錯誤),總線錯誤)
軟件來源
kill命令以及進程之間可以互相通過系統調用kill發送軟中斷信號
二、常見信號
1.可靠信號和不可靠信號
Linux信號的編號是從1-64,其中32和33空缺,沒有對應的信號。通過kill -l 可查看所有的信號
其中
- 1~31之間的信號叫做非實時信號, 不支持排隊, 信號可能會丟失, 也叫做不可靠信號。
- 34~64之間的信號叫做實時信號, 支持排隊, 信號不會丟失, 也叫做可靠信號。
2、不可靠信號主要有以下問題:
- 存在信號丟失的問題(進程收到的信號不作排隊處理,相同的信號多次到來會合并為一個)。
3、可靠信號與不可靠信號注冊機制
可靠信號注冊機制:
內核每收到一個可靠信號都會去注冊這個信號,在信號的未決信號鏈中分配sigqueue結構,因此,不會存在信號丟失的問題。
不可靠信號的注冊機制:
而對于不可靠的信號,如果內核已經注冊了這個信號,那么便不會再去注冊,對于進程來說,便不會知道本次信號的發生。
三、信號處理方式
1.默認動作,默認動作包括:
2.忽略某個信號,不做任何處理
3.捕捉信號處理
四、信號處理過程
五、未決信號和阻塞信號
信號的“未決”是一種狀態,是信號產生和遞送之間的一種狀態。信號產生,未決信號集中描述改信號的位會立即變為1,信號處于未決狀態。當信號被處理,對應位會變為0;如果信號被阻塞,那么信號的未決狀態將保持在1,信號也就無法執行。
六、信號集操作函數
#include <signal.h>
sigset_t set; // typedef unsigned long sigset_t;
int sigemptyset(sigset_t *set);
int sigfillset(sigset_t *set);
int sigaddset(sigset_t *set, int signum);
int sigdelset(sigset_t *set, int signum);
int sigismember(const sigset_t *set, int signum);
函數sigemptyset初始化set所指向的信號集,使其中所有信號的對應bit清零,表示該信號集不包含任何有效信號。函數sigfillset初始化set所指向的信號集,使其中所有信號的對應bit置位,表示該信號集的有效信號包括系統支持的所有信號。注意,在使用sigset_t類型的變量之前,一定要調用sigemptyset或sigfillset做初始化,使信號集處于確定的狀態。初始化sigset_t變量之后就可以在調用sigaddset和sigdelset在該信號集中添加或刪除某種有效信號。這四個函數都是成功返回0,出錯返回-1。sigismember是一個布爾函數,用于判斷一個信號集的有效信號中是否包含某種信號,若包含則返回1,不包含則返回0,出錯返回-1。
總結
以上是生活随笔為你收集整理的Linux系统编程(四)信号的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 哈利波特魔法觉醒手游学院帽子如何获取
- 下一篇: Linux系统编程(五)时序竞态