1. 程式人生 > >Unix環境高級編程(九)信號

Unix環境高級編程(九)信號

hup timer ext gprof reader 類型 io事件 恢復 內存

  信號時軟中斷,很多比較重要的應用程序都需要處理信號,信號提供了一種處理異步事件的方法。每個信號都一個名字,以SIG開頭,在<signal.h>頭文件中定義信號類型,都是正整數(信號編號)。

  產生信號的條件:

(1)當用戶按某些終端鍵時,引發終端產生的信號。

(2)硬件異常產生信號。

(3)進程調用kill函數將信號發送給另外一個進程或進程組。

(4)用戶用kill命令將信號發送給其他進程。

(5)檢測到某種軟件條件已經發送,並將其通知有關進程時候產生信號。

  內核在信號出現時候處理方式有:(1)忽略此信號,(2)鋪捉信號,(3)執行系統默認動作。

Unix系統信號如下:

其中SIGKILL和SIGSTOP信號時不能忽略和捕獲的,執行默認動作。

Signal

Description

SIGABRT

由調用abort函數產生,進程非正常退出

SIGALRM

用alarm函數設置的timer超時或setitimer函數設置的interval timer超時

SIGBUS

某種特定的硬件異常,通常由內存訪問引起

SIGCANCEL

由Solaris Thread Library內部使用,通常不會使用

SIGCHLD

進程Terminate或Stop的時候,SIGCHLD會發送給它的父進程。缺省情況下該Signal會被忽略

SIGCONT

當被stop的進程恢復運行的時候,自動發送

SIGEMT

和實現相關的硬件異常

SIGFPE

數學相關的異常,如被0除,浮點溢出,等等

SIGFREEZE

Solaris專用,Hiberate或者Suspended時候發送

SIGHUP

發送給具有Terminal的Controlling Process,當terminal被disconnect時候發送

SIGILL

非法指令異常

SIGINFO

BSD signal。由Status Key產生,通常是CTRL+T。發送給所有Foreground Group的進程

SIGINT

由Interrupt Key產生,通常是CTRL+C或者DELETE。發送給所有ForeGround Group的進程

SIGIO

異步IO事件

SIGIOT

實現相關的硬件異常,一般對應SIGABRT

SIGKILL

無法處理和忽略。中止某個進程

SIGLWP

由Solaris Thread Libray內部使用

SIGPIPE

在reader中止之後寫Pipe的時候發送

SIGPOLL

當某個事件發送給Pollable Device的時候發送

SIGPROF

Setitimer指定的Profiling Interval Timer所產生

SIGPWR

和系統相關。和UPS相關。

SIGQUIT

輸入Quit Key的時候(CTRL+/)發送給所有Foreground Group的進程

SIGSEGV

非法內存訪問

SIGSTKFLT

Linux專用,數學協處理器的棧異常

SIGSTOP

中止進程。無法處理和忽略。

SIGSYS

非法系統調用

SIGTERM

請求中止進程,kill命令缺省發送

SIGTHAW

Solaris專用,從Suspend恢復時候發送

SIGTRAP

實現相關的硬件異常。一般是調試異常

SIGTSTP

Suspend Key,一般是Ctrl+Z。發送給所有Foreground Group的進程

SIGTTIN

當Background Group的進程嘗試讀取Terminal的時候發送

SIGTTOU

當Background Group的進程嘗試寫Terminal的時候發送

SIGURG

當out-of-band data接收的時候可能發送

SIGUSR1

用戶自定義signal 1

SIGUSR2

用戶自定義signal 2

SIGVTALRM

setitimer函數設置的Virtual Interval Timer超時的時候

SIGWAITING

Solaris Thread Library內部實現專用

SIGWINCH

當Terminal的窗口大小改變的時候,發送給Foreground Group的所有進程

SIGXCPU

當CPU時間限制超時的時候

SIGXFSZ

進程超過文件大小限制

SIGXRES

Solaris專用,進程超過資源限制的時候發送

Unix環境高級編程(九)信號