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....