信号与操作系统软中断
一、什么是信号?
1.概述
信号量,是操作系统提供的一种用来传递特定消息的机制。通过这种方式,操作系统可以将程序运行过程中发生的各种特殊情况转发给程序,并执行相应的服务函数。
信号的出现是随机的,通过轮询的方式进行判断会消耗大量的CPU资源,所以采用异步事件处理方式,程序告诉操作系统,当某个信号到来时,应该以怎样的方式去处理,也就是当检测到信号到来,操作系统调用相应的服务函数。
2.信号与软件中断
软件中断则是指由计算机软件,通过 int 等机器指令引起的 CPU 执行流程的临时转移过程。比如系统调用,用户程序通过软件中断从用户态进入内核态,并使用内核提供的系统调用函数。
信号与软中断类似,当特定事件发生时,操作系统将对应的信号值发送给相关程序。如果应用程序未设置信号对应的处理程序,操作系统会执行默认处理程序,通常是终止程序。信号处理过程中,存在着 CPU 从用户程序到信号处理程序的执行流程转移。
3.在 C 代码中与信号交互
signal 相关信息可以参考文档。
signal 函数用于设置信号对应的处理程序,函数原型为 void (*signal( int sig, void (*handler) (int))) ,其中 sig 是信号类型,handler 是处理程序。信号类型有以下几种:

signal 和 raise 作为一对函数,分别负责关联信号与处理函数,发送信号。
需要注意的是,操作系统对信号处理函数的调用,可能发生在程序执行的任何时刻,对实际执行产生未知影响。
4.可重入函数
存在这样一种情况,当应用程序正在执行函数 A 时,有个信号出现,使操作系统打断正在执行的程序,进入到处理函数中,如果处理函数恰好也执行了 A 函数。当处理函数结束后,继续执行之前未完成的 A 函数。处理函数调用未执行完的函数是否对函数的执行产生影响呢?
不可重入函数:当函数未执行完被打断后,在处理函数中再次调用,会影响前一次的调用。
可重入函数:不受中途打断和重新调用影响的函数。
为了尽量保证函数可重入,C 标准库提供了叫做 sig_atomic_t 的整数类型,该类型可以保证,即使存在可能由于中断导致的执行流程转移,对该类型变量的读写过程也都是原子的。
5.多线程应用的信号处理
C 语言没有对并发编程中的信号处理做任何规范上的约束和建议,这意味着,在多线程中使用 signal 和 raise 函数,可能会产生未定义的行为。这些函数如何影响程序执行,取决于不同的 C 标准库在操作系统上的实现。如果想要使程序具备可移植性,可以通过宏来区分不同的操作系统,并使用操作系统本身提供的信号处理 API 。
浙公网安备 33010602011771号