为什么许多Unix程序使用像USR1这样的信号?

许多Unix程序都接受像USR1USR2这样的信号。 例如,要快速升级Nginx的可执行文件,请发送kill -USR2

我知道USR1是一个“用户自定义”的信号,意思是说创build这个程序的人可以用它来表示“closures”或“转储你的日志”或“打印上千次”等等。 但我不明白为什么他们必须使用这个任意的名字。 为什么不kill -UPGRADE ,或者kill -GRACEFUL_SHUTDOWN ? Unix只允许特定的信号?

当我们处理它时,Nginx也使用以下信号(参见文档 ):

  • TERM,INT :快速关机
  • 退出 :优雅的关机
  • HUP
    • configuration重新加载
    • 用新configuration启动新的工作进程
    • 优雅地closures旧的工作进程
  • USR1 :重新打开日志文件
  • USR2 :即时升级可执行文件
  • WINCH :正常closures工作进程

HUP? 绞盘? 这些名字的原因是什么? 我在哪里可以了解更多关于这个?

操作系统上可用的信号由操作系统定义(通常在POSIX之后) – 它们不是“string”,而是具有标准名称的整数常量。 USR1USR2是没有附加特定含义的两个信号 – 旨在用于开发者想要的任何任意用途。

在您的linux机器上,阅读man 7 signal以获取信号处理和信号的概述。

如果您准备处理响应事件发出这些信号的操作系统,您可以重新定义其他信号的含义。 你可以让HUP意思是“重新加载configuration” – 只要你确定这个进程永远不会挂断(terminal丢失),或者你准备好处理操作系统而不是用户发送HUP的情况信号。

HUP是“挂断”的简称。 如果控制terminal到达文件结尾,则将该信号发送到进程。 在过去,控制terminal通常连接到串行端口,可能通过电话线上的调制解调器连接。 如果电话连接挂断,本地调制解调器将降低载波检测线路,这将导致内核报告文件结束并发送SIGHUP信号。

WINCH是“窗口改变”的缩写。 如果控制terminal改变大小,则发送到进程。 出于显而易见的原因,可以改变大小的terminal通常是伪terminal,最终由在窗口环境中运行的terminal仿真器(如xterm )表示。

因为信号的名称是标准化的(POSIX)。 如果需要,可以编写自己的kill-type可执行文件来执行-UPGRADE ,并让它传递USR1信号,但UNIX附带的标准kill会识别它。

signal.h头文件将信号名称映射到与实现有关的实际值。

试试kill -l并自己find答案:

 1) SIGHUP 2) SIGINT 3) SIGQUIT 4) SIGILL 5) SIGTRAP 6) SIGABRT 7) SIGBUS 8) SIGFPE 9) SIGKILL 10) SIGUSR1 11) SIGSEGV 12) SIGUSR2 13) SIGPIPE 14) SIGALRM 15) SIGTERM 16) SIGSTKFLT 17) SIGCHLD 18) SIGCONT 19) SIGSTOP 20) SIGTSTP 21) SIGTTIN 22) SIGTTOU 23) SIGURG 24) SIGXCPU 25) SIGXFSZ 26) SIGVTALRM 27) SIGPROF 28) SIGWINCH 29) SIGIO 30) SIGPWR 31) SIGSYS 34) SIGRTMIN 35) SIGRTMIN+1 36) SIGRTMIN+2 37) SIGRTMIN+3 38) SIGRTMIN+4 39) SIGRTMIN+5 40) SIGRTMIN+6 41) SIGRTMIN+7 42) SIGRTMIN+8 43) SIGRTMIN+9 44) SIGRTMIN+10 45) SIGRTMIN+11 46) SIGRTMIN+12 47) SIGRTMIN+13 48) SIGRTMIN+14 49) SIGRTMIN+15 50) SIGRTMAX-14 51) SIGRTMAX-13 52) SIGRTMAX-12 53) SIGRTMAX-11 54) SIGRTMAX-10 55) SIGRTMAX-9 56) SIGRTMAX-8 57) SIGRTMAX-7 58) SIGRTMAX-6 59) SIGRTMAX-5 60) SIGRTMAX-4 61) SIGRTMAX-3 62) SIGRTMAX-2 63) SIGRTMAX-1 64) SIGRTMAX 

在符合POSIX标准的平台上, SIGUSR1SIGUSR2是发送到进程的信号,以指示用户定义的条件。 它们的符号常量在头文件signal.h 。 使用符号信号名称是因为信号编号可能在不同平台上有所不同。

SIG是信号名称的通用前缀。 USR是用户定义的缩写。

信号名称来自比Posix更早的时间。

我想谈谈SIG ** IOT **。 在使用DEC PDP主机的时候,使用的处理器有一个特殊的IOT指令(I / O陷阱),通常用来轻轻地使系统崩溃 – 通常迫使它重新启动(在实时服务器中)。 整个内核以及设备驱动程序和特权进程(用汇编语言编写)都使用了这种方法。 即使在今天,仍然有这种IOT指令的处理器。

因此,当内核在非特权域中经历了一个IOT指令的执行时,它向受影响的进程提出了一个SIGIOT。