02-信号相关的概念
10.1 信号相关的概念
信号有一个非常明确的生命周期。首先,产生(raise)信号(有时也说信号被发出或生成)。然后内核存储信号,直到可以发送该信号。最后,一旦有空闲,内核就会适当地处理信号。根据进程的请求,内核会执行以下三种操作之一:
忽略信号
不采取任何操作。但是有两种信号不能被忽略:SIGKILL和SIGSTOP。这样做的原因是系统管理员需要能够杀死或停止进程,如果进程能够选择忽略SIGKILL(使进程不能被杀死)或SIGSTOP(使进程不能被停止)将破坏这一权力。
捕获并处理信号
内核会暂停该进程正在执行的代码,并跳转到先前注册过的函数。接下来进程会执行这个函数。一旦进程从该函数返回,它会跳回到捕获信号的地方继续执行。
经常捕获的两种信号是SIGINT和SIGTERM。进程捕获SIGINT来处理用户产生的中断符——例如终端能捕获该信号并返回到主提示符。进程捕获SIGTERM以便在结束前执行必要的清理工作,例如断开网络,或删除临时文件。SIGKILL和SIGSTOP不能被捕获。
执行信号的默认操作
该操作取决于被发送的信号。默认操作通常是终止进程。例如,对SIGKILL来说就是这样。然而,许多信号是为在特定情况下的特殊目的而提供的,这些信号在默认的情况下是被忽略的,因为很多程序不关心它们。我们将很快介绍各种信号和及其默认操作。
过去,当信号被发送后,处理信号的函数只知道出现了某个信号,除此之外,对发生了什么情况却是一无所知。现在,内核能给接收信号的编程人员提供大量的上下文信息。正如我们后面将看到的,信号甚至能传递用户定义的数据。