Linux 进程通信 -- 信号
一、概述
信號用于保持進程間的通信,可以備發送到一個進程或者一組進程,發送給進程的這個唯一信息通常是標志信號的一個數。信號可從鍵盤終端產生、虛擬內存中非法訪問系統資源等情況下產生。信號異步發生,收到信號的進程可以采取某種動作或者忽略,大多數信號可以被阻塞。
對于每一個信號,進程可以采取一下三種措施進行動作或忽略:
二、Linux支持的信號
編號1~31的信號是傳統UNIX支持的信號,是不可靠信號(非實時信號);編號為32~64的信號是后來擴充的,可靠信號(實時信號)。非實時信號不支持排隊操作,可能造成信號丟失。
1、SIGHUP
在用戶終端連接(正常或非正常)結束時發出,通常是在終端的控制進程結束時,通知同一Session內的各個作業,登陸Linux時,系統分配給登陸用戶一個終端(Session)。當用戶退出Linux時,前臺進程組合后臺進程組當中,有對終端輸出的進程將收到這個SIGHUP信號。這個信號的默認操作為終止進程,因此前后臺進程中有終端輸出的進程會終止。wegt能捕獲這個信號,并忽略。
2、SIGINT
程序終止信號,在用戶輸出INTR字符(通常是Ctrl+C)時發出,用于通知前臺進程組終止進程。
3、SIGQUIT
和SIGINT類似,但由QUIT字符來控制。進程收到SIGQUIT退出時會產生core文件,類似于一個程序錯誤的信號。
4、SIGILL
執行非法指令。通常是因為可執行文件本身出錯,或者執行錯誤程序段。堆棧溢出亦可能產生。
5、SIGTRAP
由斷點指令或其他trap產生,由debugger使用。
6、SIGABRT
調用abort函數生成的信號。
7、SIGBUS
非法地址,包括內存地址對齊(alignment)出錯。
8、SIGFPE
在發生致命錯誤的運算錯誤時發出。比如浮點運算出錯,溢出及除數為0等其他所有的算數錯誤。
9、SIGKILL
立即結束程序的運行,無法被阻塞、處理和忽略。
10、SIGUSR1
用戶保留使用。
11、SIGSEGV
試圖訪問未分配給自己的內存,或者試圖往沒有寫權限的內存地址寫數據。
12、SIGUSR2
用戶保留使用。
13、SIGPIPE
管道破裂。讀取管道沒打開或者意外終止往管道寫,寫進程就會收到SIGPIPE信號。
14、SIGALRM
時鐘定時信號,計算的是實際時間或時鐘時間,alarm使用該信號。
15、SIGTERM
程序結束(terminate)信號,與SIGKILL不同,SIGTERM可以被阻塞和處理。通常永愛要求程序自己正常退出,shell命令kill 默認產生這個信號。
16、SIGSTKFLT
Linux專用,數學協處理器的棧異常。
17、SIGCHLD
子進程結束時,父進程會受到的信號。如果父進程沒有處理這個信號,也沒有等待子進程,子進程雖然終止,但是還會在內核進程表中占有表項,這時的子進程稱為僵尸進程。
18、SIGCONT
讓一個停止(Stopoed)的進程繼續執行,不可被阻塞,可以用一個handler來讓程序在有停止狀態變為繼續執行時完成特定的工作,例如重新顯示提示符。
19、SIGSTOP
停止程序的執行,進程未結束,只是暫停執行,不可被阻塞、忽略或處理。
20、SIGTSTP
停止進程的運行,但該信號可以被處理和忽略,用戶輸入SUSP(通常是Ctrl+z)發出。
21、SIGTTIN
當后臺作業要從用戶終端讀數據時,該作業中的所有進程會受到SIGTITN信號。默認時這些進程會停止執行。
22、SIGTTOU
類似SIGTTIN,在寫終端、修改終端模式時收到。
23、SIGURG
有‘緊急’數據或帶外(out-of-band)數據到達socket時產生。
24、SIGXCPU
超過CPU時間資源限制,可由getrlinit/setrlimit來讀取或改變。
25、SIGXFSZ
進程試圖擴大文件,以至于超過文件大小的資源限制。
26、SIGVTALRM
虛擬時鐘信號。類似于SIGALRM,計算進程占用的CPU時間。
27、SIGPROF
包括進程占用的CPU時間以及系統調用的時間。
28、SIGWINCH
窗口大小改變時發出。
29、SIGIO
文件描述符準備就緒,可以開始進行輸入、輸出操作。
30、SIGPWR
電源失敗。
31、SIGSYS
非法的系統調用。
?
?
?
總結
以上是生活随笔為你收集整理的Linux 进程通信 -- 信号的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: visio调整形状位置_VISIO绘图技
- 下一篇: RedHatLinux新手入门教程(4)