APUE學習筆記 13 捕捉訊號

2021-05-02 07:30:05 字數 2455 閱讀 7209

by:

潘雲登

對於商業目的下對本文的任何行為需經作者同意。

寫在前面

1.本文內容對應《

unix

環境高階程式設計》(第

2版)》第

10章。 2.

總結了sigaction

函式的用法,用以替代先前捕捉訊號使用的

signal

函式。 3.

sigaction

前面學習過

signal

函式,使用它為某個特定訊號指定乙個訊號處理函式,即可捕捉該訊號。但是,如果希望在處理訊號的同時,指定額外的訊號遮蔽字,或者更自由地控制訊號處理函式的行為,或者需要獲取訊號產生的原因,那麼應該使用更為強大的

sigaction

函式。

#include

int sigaction(int signo, const struct sigaction *restrict act, struct sigaction *restrict oact);

其中,引數

signo

是要檢查或修改其具體動作的訊號編號。若

act指標非空,則要修改其動作。若

oact

指標非空,則系統經由

oact

指標返回該訊號的上乙個動作。一旦對給定的訊號設定了乙個動作,那麼在呼叫

sigaction

顯式地改變它之前,該設定就一直有效。

struct sigaction ;

當更改訊號動作時,如果

sa_handler

字段包含乙個訊號處理函式的位址,則

sa_mask

字段說明了乙個訊號集,在呼叫該訊號處理函式之前,這一訊號集要加到程序的訊號遮蔽字中。僅當從訊號處理函式返回時再將程序的訊號遮蔽字復位為原先值。這樣,在呼叫訊號處理函式時就能阻塞某些訊號。在訊號處理函式被呼叫時,作業系統建立的新訊號遮蔽字包括正被遞送的訊號。

act結構的sa_flags

字段指定對訊號進行處理的各個選項: l

sa_interrupt

:由訊號中斷的系統呼叫不會自動重啟,這是預設處理方式。 l

sa_restart

:由此訊號中斷的系統呼叫會自動重啟動。 l

sa_nocldstop

:若signo

是sigchld

,當子程序停止或繼續時不產生此訊號。當子程序終止時,產生此訊號。 l

sa_nocldwait

:若signo

是sigchld

,則當呼叫程序的子程序終止時,不建立僵死程序。若程序在後面呼叫

wait

,則呼叫程序阻塞,直到其所有子程序終止,此時返回

-1,並設定

errno

為echild。

lsa_nodefer

:當捕捉到此訊號時,在執行其訊號處理函式時,系統不自動遮蔽此訊號。 l

sa_resethand

:在此訊號處理函式的入口處,將此訊號的處理方式復位為

sig_dfl

,並清除

sa_siginfo

標誌。

lsa_siginfo

:此選項對訊號處理函式提供附加資訊。

sa_sigaction

欄位是乙個替代的訊號處理函式,當在

sigaction

結構中使用了

sa_siginfo

標誌時,使用該訊號處理函式。它按下列方式呼叫:

void handler(int signo, siginfo_t *info, void *context);

其中,siginfo_t

結構包含了訊號產生原因的有關資訊。

context

引數是無型別指標,可被強制轉換為

ucntext_t

結構型別,用於標識訊號傳遞時程序的上下文。

實驗程式如下:

#include "apue.h"

#include

static void sig_chld(int signo)

int main()

執行結果為:

pydeng@pydeng-laptop:~/apue.2e/mytest$ ./a.out

sigchld is blocked.

in sig_chld: sigint

wait error: no child processes

APUE學習筆記 10 訊號概念

by 潘雲登 對於商業目的下對本文的任何行為需經作者同意。寫在前面 1.本文內容對應 unix 環境高階程式設計 第 2版 第 10章。2.總結了有關訊號的基本概念,包括訊號產生的原因和對訊號的處理方式。3.訊號概念 訊號是軟體中斷,提供了一種處理非同步事件的方法。每個訊號都有乙個名字,以字元 si...

APUE學習 訊號(3)

1 訊號集 本篇檔案介紹訊號集的概念。訊號集就是一些訊號的集合,型別是sigset t,這個型別是不透明的,當然可以找到標頭檔案仔細研究但意義不大。該型別所涉及的操作函式如下 cpp view plain copy intsigemptyset sigset t set 初始化訊號集set為空,不包...

APUE學習筆記 17 執行緒和訊號

by 潘雲登 對於商業目的下對本文的任何行為需經作者同意。寫在前面 1.本文內容對應 unix 環境高階程式設計 第 2版 第 12章。2.總結了如何設定執行緒的訊號遮蔽字,以及如何使用專用線程進行訊號處理。3.執行緒的訊號遮蔽字 每個執行緒都有自己的執行緒遮蔽字,但是訊號處理函式是程序中所有執行緒...