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