信號 - Linux / Unix命令

Linux支持POSIX可靠信號(以下稱為“標准信號”)和POSIX實時信號。

標准信號

Linux支持下面列出的標准信號。 如“值”欄所示,多個信號編號與體系結構相關。 (在給出三個值的情況下,第一個值通常對alpha和sparc有效,對於i386,ppc和sh是中間值,對於mips是最後一個值。

A - 表示相應架構上沒有信號。)

表中“Action”列中的條目指定了信號的默認操作,如下所示:

術語

默認操作是終止進程。

IGN

默認操作是忽略信號。

核心

默認操作是終止進程並轉儲核心。

停止

默認操作是停止進程。

首先是原始POSIX.1標準中描述的信號。

信號 行動 評論
或控製過程的死亡
SIGINT 2 術語 從鍵盤中斷
SIGQUIT 3 核心 退出鍵盤
SIGILL 4 核心 非法指令
SIGABRT 6 核心 中止信號(3)
SIGFPE 8 核心 浮點異常
SIGKILL 9 術語 殺死信號
SIGSEGV 11 核心 無效的內存引用
SIGPIPE 13 術語 損壞的管道:在沒有閱讀器的情況下寫入管道
SIGALRM 14 術語 報警定時器信號(2)
SIGTERM 15 術語 終止信號
SIGUSR1 30,10,16 術語 用戶自定義信號1
SIGUSR2 31,12,17 術語 用戶定義的信號2
SIGCHLD 20,17,18 IGN 孩子停止或終止
SIGCONT 19,18,25 如果停止繼續
SIGSTOP 17,19,23 停止 停止進程
SIGTSTP 18,20,24 停止 在tty停止輸入
SIGTTIN 21,21,26 停止 用於後台進程的tty輸入
SIGTTOU 22,22,27 停止 tty輸出用於後台進程

信號SIGKILLSIGSTOP不能被捕獲,阻塞或忽略。

接下來的信號不是在POSIX.1標準中描述的,而是在SUSv2和SUSv3 / POSIX 1003.1-2001中描述的。

信號 行動 評論
SIGPOLL 術語 可輪詢事件(系統V)。 SIGIO的同義詞
SIGPROF 27,27,29 術語 分析計時器已過期
SIGSYS 12, - ,12 核心 例程的錯誤說法(SVID)
SIGTRAP 核心 跟踪/斷點陷阱
SIGURG 16,23,21 IGN 套接字上的緊急情況(4.2 BSD)
SIGVTALRM 26,26,28 術語 虛擬鬧鐘(4.2 BSD)
SIGXCPU 24,24,30 核心 超過CPU時間限制(4.2 BSD)
SIGXFSZ 25,25,31 核心 超出文件大小限制(4.2 BSD)

直至並包括Linux 2.2, SIGSYSSIGXCPUSIGXFSZ和(在SPARC和MIPS以外的體系結構上)的缺省行為, SIGBUS將終止該進程(沒有核心轉儲)。 (在其他一些Unices中, SIGXCPUSIGXFSZ的默認操作是在沒有核心轉儲的情況下終止進程。)Linux 2.4符合POSIX 1003.1-2001對這些信號的要求,通過核心轉儲終止進程。

下一個其他各種信號。

信號 行動 評論
SIGEMT 7, - ,7 術語
SIGSTKFLT - 16 - 術語 協處理器堆棧錯誤(未使用)
SIGIO 23,29,22 術語 I / O現在可能(4.2 BSD)
SIGCLD - , - ,18 IGN SIGCHLD的同義詞
SIGPWR 29,30,19 術語 電源故障(系統V)
SIGINFO 29, - , - SIGPWR的同義詞
SIGLOST - , - , - 術語 文件鎖定丟失
SIGWINCH 28,28,20 IGN 窗口大小調整信號(4.3 BSD,Sun)
SIGUNUSED - 31 - 術語 未使用的信號(將SIGSYS)

(Signal 29是一個alpha的SIGINFO / SIGPWR ,一個sparc的SIGLOST 。)

SIGEMT未在POSIX 1003.1-2001中指定,但大多數其他Unices上都會出現neverthless,其默認操作通常是通過核心轉儲來終止進程。

SIGPWR (在POSIX 1003.1-2001中未指定)通常在默認情況下在其出現的其他Unices上被忽略。

SIGIO (在POSIX 1003.1-2001中未指定)在其他幾個Unices上默認被忽略。

實時信號

Linux支持最初在POSIX.4實時擴展中定義的實時信號(現在包含在POSIX 1003.1-2001中)。 Linux支持32個實時信號,編號從32( SIGRTMIN )到63( SIGRTMAX )。 (程序應始終使用符號SIGRTMIN + n來引用實時信號,因為實時信號數量範圍因Unices而異。)

與標准信號不同,實時信號沒有預定義的含義:整套實時信號可用於應用程序定義的目的。 (但是請注意,LinuxThreads實現使用前三個實時信號。)

未處理的實時信號的默認操作是終止接收過程。

實時信號的區別如下:

  1. 實時信號的多個實例可以排隊。 相比之下,如果標准信號的多個實例在該信號當前被阻塞的情況下被傳送,則只有一個實例被排隊。
  2. 如果使用sigqueue (2)發送信號,則可以隨信號一起發送伴隨值(整數或指針)。 如果接收進程使用sigaction (2)的SA_SIGACTION標誌為此信號建立處理程序,則它可以通過作為處理程序的第二個參數傳遞的siginfo_t結構的si_value字段獲取此數據。 此外,該結構的si_pidsi_uid字段可用於獲取發送該信號的進程的PID和實際用戶ID。
  3. 實時信號按有保證的順序交付。 多個相同類型的實時信號按照它們發送的順序傳送。 如果不同的實時信號被發送到一個過程,它們將從編號最小的信號開始傳送。 (即,低編號信號具有最高優先級。)

如果標准信號和實時信號都處於待處理狀態,則POSIX將其保留為未指定,並首先發送。 與其他許多實現一樣,Linux在這種情況下優先考慮標准信號。

根據POSIX,一個實現應該允許至少_POSIX_SIGQUEUE_MAX(32)實時信號排隊到一個進程。 然而,Linux並沒有放置每個進程的限制,而是對所有進程的排隊實時信號的數量施加了系統範圍的限制。

這個限制可以通過/ proc / sys / kernel / rtsig-max文件查看(並且有權限)。 可以使用相關文件/ proc / sys / kernel / rtsig-max來找出當前正在排隊的實時信號數量。

遵守

POSIX.1

重要提示:使用man命令( %man )查看特定計算機上的命令使用方式。