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輸出用於後台進程 |
信號SIGKILL和SIGSTOP不能被捕獲,阻塞或忽略。
接下來的信號不是在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, SIGSYS , SIGXCPU , SIGXFSZ和(在SPARC和MIPS以外的體系結構上)的缺省行為, SIGBUS將終止該進程(沒有核心轉儲)。 (在其他一些Unices中, SIGXCPU和SIGXFSZ的默認操作是在沒有核心轉儲的情況下終止進程。)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實現使用前三個實時信號。)
未處理的實時信號的默認操作是終止接收過程。
實時信號的區別如下:
- 實時信號的多個實例可以排隊。 相比之下,如果標准信號的多個實例在該信號當前被阻塞的情況下被傳送,則只有一個實例被排隊。
- 如果使用sigqueue (2)發送信號,則可以隨信號一起發送伴隨值(整數或指針)。 如果接收進程使用sigaction (2)的SA_SIGACTION標誌為此信號建立處理程序,則它可以通過作為處理程序的第二個參數傳遞的siginfo_t結構的si_value字段獲取此數據。 此外,該結構的si_pid和si_uid字段可用於獲取發送該信號的進程的PID和實際用戶ID。
- 實時信號按有保證的順序交付。 多個相同類型的實時信號按照它們發送的順序傳送。 如果不同的實時信號被發送到一個過程,它們將從編號最小的信號開始傳送。 (即,低編號信號具有最高優先級。)
如果標准信號和實時信號都處於待處理狀態,則POSIX將其保留為未指定,並首先發送。 與其他許多實現一樣,Linux在這種情況下優先考慮標准信號。
根據POSIX,一個實現應該允許至少_POSIX_SIGQUEUE_MAX(32)實時信號排隊到一個進程。 然而,Linux並沒有放置每個進程的限制,而是對所有進程的排隊實時信號的數量施加了系統範圍的限制。
這個限制可以通過/ proc / sys / kernel / rtsig-max文件查看(並且有權限)。 可以使用相關文件/ proc / sys / kernel / rtsig-max來找出當前正在排隊的實時信號數量。
遵守
POSIX.1
重要提示:使用man命令( %man )查看特定計算機上的命令使用方式。