10 訊號處理 signal sigaction

2021-10-24 08:20:21 字數 1310 閱讀 7093

1、signal

各種事件促使核心向程序傳送訊號,包括使用者的擊鍵、程序的非法操作和計時器到時,乙個程序呼叫signal在一下3種處理訊號的方法之中選擇:

signal的缺陷:signal處理根據不同版本不同選擇

2、sigaction

在posix中用sigaction替代signal,解決上訴缺陷。

sigaction系統呼叫:

(1)定製訊號處理:struct sigaction

結構體sigaction定義了如何處理乙個訊號

struct sigaction ;

(2)選擇sa_handler還是sa_sigaction

要在老的訊號處理方式和新的更強大的訊號處理方式之間作出選擇。如果老的處理方式(sig_del、sig_ign、handler)夠用了,那麼可以設定sa_handler為其中之一。如果設定sa_sigaction為乙個處理函式,name那個處理函式被呼叫的時候,不但可以得到訊號編號而且可以獲悉被呼叫的原因以及產生問題的上下文的相關資訊。設定sa_flags的sa_siginfo位來告訴核心使用新的訊號處理方式。

(3)sa_flags

sa_flags用一些位來控制處理函式如何應對上述4個問題。

(4)sa_mask

sa_mask決定在處理乙個資訊時是否阻塞其他訊號。sa_mask中的位指定哪些訊號要被阻塞。sa_mask的值包括要被阻塞的訊號集。

3、訊號總結

乙個程序可能被各種**的訊號中斷。訊號可能在任何時候以任何順序到達。signal提供一種簡單但是不完整的訊號處理機制。posix介面,sigaction提供了複雜的、明確定義的方法來控制程序如何處理這些訊號組合做出反應

4、編寫訊號處理程式

sigdemo3.c

signal訊號處理方式的程式

#include#include#include#define inputlen 100

void inthandler(int s)

void quithandler(int s)

int main()

}while(strncmp(input,"quit",4)!=0);

return 0;

}

sigactdemo.c

sigaction訊號處理的程式

#include#include#define inputlen 100

void inthandler(int s)

int main()

return 0;

}

訊號處理,訊號佇列

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

Linux程序訊號 訊號處理

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

訊號 訊號處理函式(捕捉)

要明白訊號處理函式的使用,就要先知道訊號的捕捉設定,什麼時候會呼叫訊號處理函式和其執行的流程是什麼,下圖完整的展示了訊號捕捉的設定,以及訊號處理函式的觸發機制 所以,從上圖可以知道,只有當程式中斷,異常或系統呼叫,才會進入核心態,也只有進入了核心態才能處理訊號,在這裡初學者常常有乙個誤區,他們會覺得...