捕捉信号然后运行自己的代码

有时你希望在别人打断你的程序时运行自己的代码。假设进程打开了一些文件连接或网络连接,你希望在退出之前把它们关闭,并且做一些清理工作。当计算机在向你发送信号时,如何让它运行你的代码呢?可以用sigaction

sigaction是一个函数包装器

sigaction是一个结构体,它有一个函数指针。sigaction告诉操作系统进程收到某个信号时应该调用哪个函数。如果想在某人向进程发送中断信号时让操作系统调用diediedie()函数,就需要把diediedie()函数包装成sigaction

sigaction的创建方法如下:

捕捉信号然后运行自己的代码 - 图1

sigaction包装的函数就叫处理器,因为它将用来处理发送给它的信号,而处理器必须以特定的方式创建。

处理器必须接收信号参数

信号是一个整型值,如果你创建了一个自定义处理器函数,就需要接收一个整型参数,像这样:

捕捉信号然后运行自己的代码 - 图2

因为我们以参数的形式传递信号,所以多个信号可以共用一个处理器;也可以为每个信号写一个处理器,完全由你做主。

处理器的代码应该短而快,刚好能处理接收到的信号就好。

捕捉信号然后运行自己的代码 - 图3

在处理器函数中使用标准输出和标准错误时要小心。

虽然示例代码在标准输出中显示了文本,但在更复杂的程序中这么做时千万要小心。之所以会有信号就是因为程序中发生了故障,而故障可能就是标准输出无法使用,因此要小心。