APUE學習筆記 10 訊號概念

2021-05-02 05:47:41 字數 2757 閱讀 3454

by:

潘雲登

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

寫在前面

1.本文內容對應《

unix

環境高階程式設計》(第

2版)》第

10章。 2.

總結了有關訊號的基本概念,包括訊號產生的原因和對訊號的處理方式。 3.

訊號概念

訊號是軟體中斷,提供了一種處理非同步事件的方法。每個訊號都有乙個名字,以字元

sig開頭,定義為正整數。在

linux

下,目前有

31種不同的訊號,定義在

中。不存在編號為

0的訊號。很多條件可以產生訊號: l

當使用者按某些終端鍵時,引發終端產生的訊號,如中斷(

ctrl+c

,sigint

)、退出(

ctrl+/

,sigquit

)和掛起(

ctrl+z

,sigtstp

)鍵。

l硬體異常產生訊號,如除數為

0、浮點溢位(

sigfpe

),無效的記憶體引用(

sigsegv

)等。

l程序呼叫

kill

函式可將訊號傳送給另乙個程序或程序組。 l

使用者可用

kill

命令將訊號傳送給其它程序。常用此命令終止乙個失控的後台程序。 l

當檢測到某種軟體條件已經發生,並應將其通知有關時也產生訊號,如程序所設定的定時器到期時產生

sigalrm。

當某個訊號出現時,可以以三種方式之一進行處理: l

忽略訊號。有兩種訊號(

sigkill

和sigstop

)不能被忽略,它們向超級使用者提供了使程序終止或停止的可靠方法。 l

捕捉訊號。為做到這一點,要通知核心在某種訊號發生時呼叫乙個使用者函式。不能捕捉

sigkill

和sigstop

訊號。

l執行系統預設動作。針對大多數訊號的系統預設動作是終止程序。

捕捉訊號

要捕捉乙個訊號,最簡單的方式是呼叫

signal

函式為它指定乙個訊號處理函式。

#include

void (*signal(int signo, void (*func)(int)))(int);

signo

引數是訊號名,

func

引數的值是常量

sig_ign

(忽略)、

sig_dfl

(預設)或訊號處理函式的位址。訊號處理函式接收訊號名作為引數,並且沒有返回值。

signal

函式的返回值是

sig_ign

、sig_dfl

或指向之前的訊號處理函式的指標,若出錯則返回

sig_err

。當乙個程序呼叫

fork

時,其子程序繼承父程序的訊號處理方式。但

exec

函式將原先設定為要捕捉的訊號都更改為它們的預設方式,因為原訊號處理函式可能在所執行的新程式中並無定義。

值得注意的是,在進入訊號處理函式中,將遮蔽當前訊號。訊號遮蔽的概念將在以後解釋。

可重入函式

程序捕捉到訊號並對其進行處理時,程序正在執行的指令序列就被訊號處理函式臨時中斷。它首先執行該訊號處理函式中的指令。如果從訊號處理函式返回(如沒有呼叫

exit

或longjmp

),則繼續執行在捕捉到訊號時程序正在執行的正常指令序列(類似於硬體中斷)。但在訊號處理函式中,不能判斷捕捉到訊號時程序在何處執行。因此,在訊號處理函式中應當呼叫可重入函式。否則,其結果是不可預見的。

不可重入函式的原因主要是:

1)使用靜態資料結構;

2)呼叫

malloc

或free;3

)是標準

io函式,標準

io庫德很多實現都以不可重入方式使用全域性資料結構。

由於每個執行緒只有乙個

errno

變數,所以訊號處理函式可能會修改其原先值。作為乙個通用的規則,當在訊號處理函式中呼叫可能修改

errno

值的函式時,應當在其前儲存,在其後恢復

errno。

實驗程式如下:

#include "apue.h"

#include

void sig_quit(int signo)

int main()

pause();

exit(exit_success); }

執行結果為:

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

^/receive sigquit.

in sig_quit:

receive sigquit.

in sig_quit:

APUE筆記之10章 訊號

訊號是軟體中斷。訊號提供非同步事件處理方法。早期的訊號模型 不可靠,訊號可能丟失。posix.1對可靠訊號例程進行了標準化。呼叫kill 2 函式可將任意訊號傳送給另乙個程序或程序組,但有限制 當某個訊號出現時,核心有3種處理方式 忽略 有2種訊號不能被忽略 sigkill 和 sigstop,原因...

APUE學習筆記 13 捕捉訊號

by 潘雲登 對於商業目的下對本文的任何行為需經作者同意。寫在前面 1.本文內容對應 unix 環境高階程式設計 第 2版 第 10章。2.總結了sigaction 函式的用法,用以替代先前捕捉訊號使用的 signal 函式。3.sigaction 前面學習過 signal 函式,使用它為某個特定訊...

APUE讀書筆記 第10章 訊號

第10章 訊號 10.1 引言 訊號是軟體中斷。訊號提供了一種處理非同步事件的方法 10.2 訊號概念 每個訊號都有乙個名字。這些名字都以三個字元sig開頭 在標頭檔案中,這些訊號被定義為正整數 訊號編號 不存在編號為0的訊號。kill函式對訊號編號0有特殊的應用。此種訊號編號值被稱為空訊號 10....