1. 程式人生 > >作業系統訊號

作業系統訊號

SIGKILL

POSIX相容的平臺上,SIGKILL是傳送給一個程序來導致它立即終止的訊號SIGKILL符號常量標頭檔案signal.h中定義。因為在不同平臺上,訊號數字可能變化,因此符號訊號名被使用,然而在大量主要的系統上,SIGKILL是訊號#9

SIGKILL被髮送給一個程式時,它使程式立即終止。與SIGTERMSIGINT相比,這個訊號不能被捕獲或忽略,同時接收這個訊號的程序在收到這個訊號時不能執行任何清理。

殭屍程序不能被殺死,因為它們已經死亡,只等待它們的父程序回收它們。

處於阻塞狀態的程序不會死亡,直到它們再次醒來。

init程序是特殊的:它不獲得它不想處理的訊號,因此它可以忽略

SIGKILL

因為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 keyDELETE

ctrl+c)會產生SIGINT訊號。這個訊號會被髮送到程序(inforeground process group)。當我們想終止一個失控程式(runaway program,可以傳送這個訊號。用於結束前臺程序。

3.      SIGKILL

“kill -9 pid” 會發送SIGKILL到程序pid.

另外此訊號程序不能夠捕獲。用於強制結束程序pid.

SIGBUS

有多種可能導致SIGBUS訊號:
1)
硬體故障,不用說,程式設計師最常碰上的肯定不是這種情形。

2) Linux平臺上執行malloc(),如果沒有足夠的RAMLinux不是讓malloc()失敗返回, 而是向當前程序分發SIGBUS訊號。

3) 某些架構上訪問資料時有對齊的要求,比如只能從4位元組邊界上讀取一個4位元組的資料型別。IA-32架構沒有硬性要求對齊,儘管未對齊的訪問降低執行效率。另外一些架構,比如SPARCm68k,要求對齊訪問,否則向當前程序分發SIGBUS訊號。

SIGBUSSIGSEGV訊號一樣,可以正常捕獲。SIGBUS的預設行為是終止當前程序併產生core dump
SIGBUSSIGSEGV訊號的一般區別如下:
1) SIGBUS(Bus error)
意味著指標所對應的地址是有效地址,但匯流排不能正常使用該指標。通常是未對齊的資料訪問所致。
2) SIGSEGV(Segment fault)意味著指標所對應的地址是無效地址,沒有實體記憶體對應該地址。

SIGSTOP

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

SIGTSTPSIGSTOP的唯一區別:

將程序暫停是SIGTSTP的預設action,使用者可以自定義一其handler,而將程序暫停是SIGSTOP的定死的action,使用者不能修改。此外,二者沒什麼差別,都使用SIGCONT來講程序重新啟用。