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 )查看特定计算机上的命令使用方式。