Skip to main content

信号 - Linux / Unix命令

9.1 什么是shell —— Linux教程 命令指令 运维 服务器 项目上线 CentOS 从入门到精通 (六月 2025)

9.1 什么是shell —— Linux教程 命令指令 运维 服务器 项目上线 CentOS 从入门到精通 (六月 2025)
Anonim

Linux支持POSIX可靠信号(以下称“标准信号”)和POSIX实时信号。

标准信号

Linux支持下面列出的标准信号。几个信号编号取决于架构,如“值”列中所示。 (给出三个值,第一个通常对alpha和sparc有效,中间一个对i386,ppc和sh,最后一个对mips有效。

A - 表示相应架构上不存在信号。)

表的“Action”列中的条目指定信号的默认操作,如下所示:

术语

默认操作是终止进程。

IGN

默认操作是忽略该信号。

核心

默认操作是终止进程并转储核心。

停止

默认操作是停止该过程。

首先是原始POSIX.1标准中描述的信号。

信号行动评论
或控制过程的死亡
SIGINT2术语键盘中断
SIGQUIT3核心从键盘退出
SIGILL4核心非法指令
SIGABRT6核心中止信号 退出 (3)
SIGFPE8核心浮点异常
SIGKILL9术语杀死信号
SIGSEGV11核心无效的内存引用
SIGPIPE13术语断管:写入没有读卡器的管道
SIGALRM14术语定时器信号来自 报警 (2)
SIGTERM15术语终止信号
SIGUSR130,10,16术语用户定义的信号1
SIGUSR231,12,17术语用户定义的信号2
SIGCHLD20,17,18IGN孩子停止或终止
SIGCONT19,18,25 如果停止则继续
SIGSTOP17,19,23停止停止进程
SIGTSTP18,20,24停止停止输入tty
SIGTTIN21,21,26停止用于后台进程的tty输入
SIGTTOU22,22,27停止tty输出用于后台进程

信号SIGKILLSIGSTOP 无法捕获,阻止或忽略。

接下来是不在POSIX.1标准中但在SUSv2和SUSv3 / POSIX 1003.1-2001中描述的信号。

信号行动评论
SIGPOLL 术语可轮询事件(Sys V)。 SIGIO的同义词
SIGPROF27,27,29术语分析计时器已过期
SIGSYS12,-,12核心常规的错误参数(SVID)
SIGTRAP5核心跟踪/断点陷阱
SIGURG16,23,21IGN套接字的紧急情况(4.2 BSD)
SIGVTALRM26,26,28术语虚拟闹钟(4.2 BSD)
SIGXCPU24,24,30核心超出CPU时间限制(4.2 BSD)
SIGXFSZ25,25,31核心超出文件大小限制(4.2 BSD)

最高级别包括Linux 2.2,默认行为SIGSYS, SIGXCPU, SIGXFSZ和(在SPARC和MIPS以外的体系结构上)SIGBUS 是终止进程(没有核心转储)。 (在其他一些Unices上的默认操作SIGXCPUSIGXFSZ 是在没有核心转储的情况下终止进程。)Linux 2.4符合POSIX 1003.1-2001对这些信号的要求,使用核心转储终止进程。

其他各种其他信号。

信号行动评论
SIGEMT7,-,7术语
SIGSTKFLT-,16,-术语协处理器堆栈故障(未使用)
SIGIO23,29,22术语现在可以进行I / O(4.2 BSD)
SIGCLD-,-,18IGNSIGCHLD的同义词
SIGPWR29,30,19术语电源故障(系统V)
SIGINFO29,-,- SIGPWR的同义词
SIGLOST-,-,-术语文件锁丢失
SIGWINCH28,28,20IGN窗口调整大小信号(4.3 BSD,Sun)
SIGUNUSED-,31,-术语未使用的信号(将是SIGSYS)

(信号29是SIGINFO / SIGPWR 在阿尔法上但是SIGLOST 在sparc上。)

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),可以随信号发送伴随值(整数或指针)。如果接收进程使用,则为此信号建立处理程序SA_SIGACTION 国旗的sigaction(2)然后它可以通过获得这些数据 si_value 的领域 siginfo_t 结构作为第二个参数传递给处理程序。而且, si_pid 和 si_uid 该结构的字段可用于获得发送信号的过程的PID和实际用户ID。
  3. 实时信号以保证顺序传送。相同类型的多个实时信号按发送顺序传送。如果向进程发送不同的实时信号,则从编号最小的信号开始传送它们。 (即,低编号信号具有最高优先级。)

如果标准和实时信号都处于待处理状态,则POSIX将其保留为未指定的信号,并将其首先传送。与许多其他实现一样,Linux在这种情况下优先考虑标准信号。

根据POSIX,实现应该允许至少_POSIX_SIGQUEUE_MAX(32)个实时信号排队到进程。但是,Linux并未对每个进程进行限制,而是对所有进程的排队实时信号数量施加系统限制。

可以通过以下方式查看此限制(并使用权限) 的/ proc / SYS /内核/ rtsig-MAX 文件。相关文件, 的/ proc / SYS /内核/ rtsig-MAX ,可用于查明当前排队的实时信号数量。

符合

POSIX.1

重要: 使用 人 命令( % 人 )查看特定计算机上如何使用命令。