处理Unix信号

Go为程序员提供了os/signal包来处理信号。本节将向你显示如何处理Unix信号。

首先,让我们介绍Unix信号的一些有用信息。你是否使用Ctrl+C停止正在运行的程序?如果是,则它们已经比较相似,因为Ctrl+C向程序发送SIGINT signal。严格来讲,Unix信号是可以通过名称或数字访问的软件中断,它们提供了在Unix系统上处理异步事件的方法。有两种方式发送信号:通过名字或者通过数字。通常来说,通过名字发送信号比较安全,因为你不太可能不小心发出错误的信号。

一个程序是不可能处理所有的信号的:一些信号既不能被捕获,也不能被忽略。SIGKILLSIGSTOP信号不能被捕获、阻塞或忽略。这样做的原因是,它们为内核和根用户提供了一种停止任何进程的方法。SIGKILL信号,即数字9,通常在需要响应迅速的极端条件下调用。因此,它是唯一一个通常由数字调用的信号,这仅仅是因为这样做更快。

signal.SIGINFOLinux机器上不可用。这意味着,如果你要在一个Linux机器上运行包含它的Go程序,则需要用另一个信号替换它,否则Go程序将无法编译和执行。

给进程发送信号的最常用方式是通过kill(1)方法。默认情况下,kill(1)发送SIGTERM信号。如果你想查看Unix机器上支持的所有信号,可以执行kill -l命令。

如果你在无权限的情况下给一个进程发送信号,kill(1)并不会执行,且会返回类似如下的错误提示:

  1. $ kill 1210
  2. -bash: kill: (1210) - Operation not permitted