POSIX相容的平台上,SIGSEGV是當一個行程執行了一個無效的內存參照,或發生區段錯誤時傳送給它的訊號。SIGSEGV的符號常數標頭檔signal.h中定義。因為在不同平台上,訊號數字可能變化,因此符號訊號名被使用。通常,它是訊號#11。[1]

SIGSEGV
描述無效內存參照
預設動作行程異常終止
SA_SIGINFO巨集
SEGV_MAPERR 地址沒有對映到對象
SEGV_ACCERR 對對映的對象沒有權限

語源 編輯

SIG是訊號名的通用字首SEGVsegmentation violation(區段違例)的縮寫

使用 編輯

對於不正確的內存處理(見區段錯誤),電腦程式可能投擲SIGSEGV。作業系統可能使用訊號堆疊向一個處於自然狀態的應用程式通告錯誤,由此,開發者可以使用它來除錯程式或處理錯誤。

在一個程式接收到SIGSEGV時的預設動作是異常終止。這個動作也許會結束行程,但是可能生成一個核心檔案以幫助除錯,或者執行一些其他特定於某些平台的動作。例如,使用了grsecurity修補程式的Linux系統可能記錄SIGSEGV訊號以監視可能的使用緩衝區溢位的攻擊嘗試。

SIGSEGV可以被擷取。也就是說,應用程式可以請求它們想要的動作,以替代預設發生的動作。這樣的動作可以是忽略它、呼叫一個函數,或恢復預設的動作。在一些情形下,忽略SIGSEGV導致未定義行為[2]

一個應用程式可能處理SIGSEGV的例子是除錯器,它可能檢查訊號堆疊並通知開發者目前所發生的,以及程式終止的位置。

SIGSEGV通常由作業系統生成,但是有適當權限的用戶可以在需要時使用kill系統呼叫kill命令(一個用戶級程式,或者一個shell內建命令)來向一個行程傳送訊號。

參考 編輯

  1. ^ sourceware.org Git - glibc.git/blob - bits/signum.h. 2001-07-06 [2009-11-18]. [永久失效連結]
  2. ^ System Interfaces Chapter 2. 2004年 [2009-11-18]. (原始內容存檔於2009-03-03). 

外部連結 編輯