许多Unix程序接受像USR1和的信号USR2.例如,要动态升级Nginx的可执行文件,请发送kill -USR2.
我知道这USR1是一个"用户定义"信号,这意味着创建程序的人可以用它来表示"关闭"或"转储你的日志"或"打印foo一千次"或其他什么.但我不明白为什么他们必须使用这个任意名称.为什么不kill -UPGRADE,或kill -GRACEFUL_SHUTDOWN?Unix只允许特定信号吗?
当我们参与其中时,Nginx还使用以下信号(参见文档):
HUP?绞车?这些名字的原因是什么?我在哪里可以了解更多相关信息?
Eri*_*rik 75
OS上可用的信号由OS定义(通常在POSIX之后) - 它们不是"字符串",而是具有标准名称的整数常量.USR1并且USR2是两个没有附加特定含义的信号 - 用于开发人员想要的任意使用.
在您的linux机器上,阅读man 7 signal有关信号处理和信号的概述.
如果您准备处理响应事件发出这些信号的操作系统,您可以重新定义其他信号的含义.您可以例如进行HUP"重新加载配置" - 只要您确定该进程永远不会出现挂起(终端丢失),或者您已准备好处理操作系统而非用户发送HUP信号的情况.
caf*_*caf 18
HUP是"挂断"的缩写.如果其控制终端到达文件结尾,则将该信号发送到进程.在过去,控制终端通常连接到串行端口,可能通过电话线上的调制解调器链路.如果电话连接挂断,本地调制解调器将降低载波检测线,这将导致内核报告文件结束和SIGHUP发送信号.
WINCH是"窗口改变"的缩写.如果其控制终端改变大小,则将其发送到进程.出于显而易见的原因,可以改变大小的终端通常是伪终端,最终由在窗口环境(例如xterm)中运行的终端仿真器表示.
尝试kill -l自己找到答案:
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
Run Code Online (Sandbox Code Playgroud)
因为信号的名称是标准化的(通过POSIX).如果需要,您可以编写自己的kill-type可执行文件-UPGRADE并让它传递USR1信号,但killUNIX附带的标准将无法识别它.
或者,您可以创建别名,函数或shell脚本来为您进行翻译,例如使用bash别名:
alias upgrade='kill -USR1'
Run Code Online (Sandbox Code Playgroud)
在signal.h头文件中的信号名称映射到它们的实际值,这是实现相关.
就WINCH我而言,我认为这有点令人厌恶.这是当窗口大小发生变化时(特别是当控制终端的窗口发生变化时)传递给应用程序的信号.
使用它来优雅地关闭工作线程不是一个好主意,除非你能保证进程永远不会在终端中运行.我知道如果我正在运行一个应用程序,我会非常恼火,它决定取消所有飞行工作,因为我最大化了窗口:-)
小智 5
信号名称起源于比 Posix 更早的时代。
我想谈谈SIG**IOT**。在使用 DEC PDP 大型机的时代,所使用的处理器有一个特殊的 IOT 指令(I/O 陷阱),通常用于轻轻地使系统崩溃——通常强制它重新启动(在实时服务器中)。整个内核以及设备驱动程序和特权进程(用汇编程序编写)都使用了这种方法。即使在今天,仍有处理器具有此 IOT 指令。
因此,当内核在非特权域中执行 IOT 指令时,它会向受影响的进程引发 SIGIOT。