歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux編程 >> Linux編程 >> 一步一步學Linux C:信號具體含義解釋

一步一步學Linux C:信號具體含義解釋

日期:2017/3/1 10:26:14   编辑:Linux編程

信號及其簡介

信號是一種進程通信的方法,他應用於異步事件的處理。信號的實現是一種軟中斷。它被發送為一個正在運行的進程,已告知進程某個事件發生了。

1) SIGHUP 本信號在用戶終端連接(正常或非正常)結束時發出,通常是在終端的控

制進程結束時, 通知同一session內的各個作業,這時它們與控制終端不再關聯.

2) SIGINT 程序終止(interrupt)信號,通常是從終端發出中斷指令如ctrl+c或delete鍵

3) SIGQUIT 和SIGINT類似,但由QUIT字符(通常是Ctrl+\)來控制.進程在因收到

SIGQUIT退出時會產生core文件,在這個意義上類似於一個程序錯誤信號.

4) SIGILL 執行了非法指令.通常是因為可執行文件本身出現錯誤,或者試圖執行

數據段. 堆棧溢出時也有可能產生這個信號.

5) SIGTRAP 跟蹤陷阱信號,由斷點指令或其它trap指令產生.由debugger使用.

6) SIGABRT 調用abort時產生的信號,將會使進程非正常結束。

6) SIGIOT IO錯誤信號.

7) SIGBUS 系統總線錯誤時產生的信號,非法地址,包括內存地址對齊(alignment)出錯.eg: 訪問一個四個字長

的整數, 但其地址不是4的倍數.

8) SIGFPE 在發生致命的算術運算錯誤時發出.不僅包括浮點運算錯誤,還包括溢

出及除數為0等其它所有的算術的錯誤.

9) SIGKILL 可以終止任何進程的信號,只能由管理員發出,該信號不會被捕捉和忽略。

10) SIGUSR1 留給用戶使用,用戶可在應用程序中自行定義。

11) SIGSEGV 試圖訪問未分配給自己的內存,或試圖往沒有寫權限的內存地址寫數據,非法使用內存地址信號。

12) SIGUSR2 留給用戶使用

13) SIGPIPE 當一個進程對管道進行完讀後進行寫時產生的信號。

14) SIGALRM 時鐘定時信號,由alarm函數設定的時間終止時產生的信號。

15) SIGTERM 程序結束(terminate)信號,與SIGKILL不同的是該信號可以被阻塞和處理.通常用來要求程序自己正常退出.shell命令kill缺省產生這個信號.

17) SIGCHLD 子進程結束或中斷時產生該信號,父進程會收到這個信號.通過該信號父進程可以知道子進程的運行情況。但大多數情況下此信號會被忽略。

18) SIGCONT 讓一個停止(stopped)的進程繼續執行.本信號不能被阻塞.

19) SIGSTOP 停止(stopped)進程的執行.注意它和terminate以及interrupt的區別:

該進程還未結束, 只是暫停執行.本信號不能被阻塞,處理或忽略.

20) SIGTSTP 停止進程的運行,但該信號可以被處理和忽略.用戶鍵入SUSP字符時

(通常是Ctrl-Z)發出這個信號

21) SIGTTIN 當後台作業要從用戶終端讀數據時,中斷驅動器產生的信號。當讀入數據的進程阻塞或忽略這個信號,或讀取數據的進程所在進程組是一個孤立進程組時,信號不會發生,並且發生讀錯誤。errno被設為ETO

22) SIGTTOU 類似於SIGTTIN,當後台作業要從用戶終端讀數據時,中斷驅動器產生的信號。當讀入數據的進程阻塞或忽略這個信號,或讀取數據的進程所在進程組是一個孤立進程組時,信號不會發生,並且發生讀錯誤。errno被設為ETO。唯一不同的是進程可以選擇後台寫。

23) SIGURG socket上出現緊急情況是發出的信息。

24) SIGXCPU 超過CPU時間資源限制.這個限制可以由getrlimit/setrlimit來讀取/改變

25) SIGXFSZ 超過文件大小資源限制.

26) SIGVTALRM 虛擬時鐘信號.類似於SIGALRM,但是計算的是該進程占用的CPU時間.

27) SIGPROF 類似於SIGALRM/SIGVTALRM,但包括該進程用的CPU時間以及系統調用的時間.

28) SIGWINCH 窗口大小改變時發出.

29) SIGIO 文件描述符准備就緒,可以開始進行輸入/輸出操作.

30) SIGPWR Power failure 電源失效信號。

31)SIGEMT實時硬件發生錯誤時產生的信號。

有兩個信號可以停止進程:SIGTERM和SIGKILL。 SIGTERM比較友好,進程能捕捉這個信號,根據您的需要來關閉程序。在關閉程序之前,您可以結束打開的記錄文件和完成正在做的任務。在某些情況下,假如進程正在進行作業而且不能中斷,那麼進程可以忽略這個SIGTERM信號。

對於SIGKILL信號,進程是不能忽略的。這是一個 “我不管您在做什麼,立刻停止”的信號。假如您發送SIGKILL信號給進程,Linux就將進程停止在那裡。

注:有六個信號被稱為作業信號,SIGCHLD,SIGCONT,SIGSTOP,SIGSTP,SIGTTNI,SIGTTOU.這些信號都是用於協調和組織各個進程的,也就是實現所謂的作業控制。通常情況下用戶不需要對這些信號進行處理,shell會自動完成對這些信號的處理工作。信號之間是相互影響的,當進程接收到SIGCONT信號時,被系統懸掛的SIGSTOP,SIGSTP,SIGTTIN,SIGTTOU將失效。同樣進程接收到SIGSTOP,SIGSTP,SIGTTIN,SIGTTOU時,SIGCONT將失效。

Copyright © Linux教程網 All Rights Reserved