作業系統訊號
SIGKILL
在POSIX相容的平臺上,SIGKILL是傳送給一個程序來導致它立即終止的訊號。SIGKILL的符號常量在標頭檔案signal.h中定義。因為在不同平臺上,訊號數字可能變化,因此符號訊號名被使用,然而在大量主要的系統上,SIGKILL是訊號#9。
當SIGKILL被髮送給一個程式時,它使程式立即終止。與SIGTERM和SIGINT相比,這個訊號不能被捕獲或忽略,同時接收這個訊號的程序在收到這個訊號時不能執行任何清理。
殭屍程序不能被殺死,因為它們已經死亡,只等待它們的父程序回收它們。
處於阻塞狀態的程序不會死亡,直到它們再次醒來。
init程序是特殊的:它不獲得它不想處理的訊號,因此它可以忽略
因為SIGKILL不給程序任何在終止時做清理操作的機會,在大部分系統關閉過程中,在採取SIGKILL之前,使用訊號SIGTERM使程序終止的嘗試先被作出。
即使SIGKILL被髮送給它,一個正在不可中斷睡眠的程序也可能不會終止(並且釋放它的資源)。這是少數幾個一個UNIX系統可能需要被重新啟動來解決臨時軟體問題的例子中的一個。
SIGTREM
SIGTERM比較友好,程序能捕捉這個訊號, 根據您的需要來關閉程式。在關閉程式之前,您可以結束開啟的記錄檔案和完成正在做的任務。 在某些情況下,假如程序正在進行作業而且不能中斷,那麼程序可以忽略這個SIGTERM訊號。
對於SIGKILL訊號,程序是不能忽略的。 這是一個 '“我不管您在做什麼,立刻停止”'的訊號。 假如您傳送SIGKILL訊號給程序, FreeBSD就將程序停止在那裡。
1. SIGTERM
“kill pid” 會發送SIGTERM到程序pid.
This is the termination signal sent by killcommand by default.
2. SIGINT
在終端中敲入interrupt key(DELETE
3. SIGKILL
“kill -9 pid” 會發送SIGKILL到程序pid.
另外此訊號程序不能夠捕獲。用於強制結束程序pid.
SIGBUS
有多種可能導致SIGBUS訊號:
1) 硬體故障,不用說,程式設計師最常碰上的肯定不是這種情形。
2) Linux平臺上執行malloc(),如果沒有足夠的RAM,Linux不是讓malloc()失敗返回, 而是向當前程序分發SIGBUS訊號。
3) 某些架構上訪問資料時有對齊的要求,比如只能從4位元組邊界上讀取一個4位元組的資料型別。IA-32架構沒有硬性要求對齊,儘管未對齊的訪問降低執行效率。另外一些架構,比如SPARC、m68k,要求對齊訪問,否則向當前程序分發SIGBUS訊號。
SIGBUS與SIGSEGV訊號一樣,可以正常捕獲。SIGBUS的預設行為是終止當前程序併產生core dump。
SIGBUS與SIGSEGV訊號的一般區別如下:
1) SIGBUS(Bus error)意味著指標所對應的地址是有效地址,但匯流排不能正常使用該指標。通常是未對齊的資料訪問所致。
2) SIGSEGV(Segment fault)意味著指標所對應的地址是無效地址,沒有實體記憶體對應該地址。
SIGSTOP
中止程序。無法處理和忽略。
SIGTSTP和SIGSTOP的唯一區別:
將程序暫停是SIGTSTP的預設action,使用者可以自定義一其handler,而將程序暫停是SIGSTOP的定死的action,使用者不能修改。此外,二者沒什麼差別,都使用SIGCONT來講程序重新啟用。