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). 

外部連結