信号机制下的非局部跳转

48 阅读1分钟

提到跳转机制,就必须要提到 goto 语句和一般情况下的非局部跳转机制,我们应当看到的是: 第一,我们的 goto 语句,只能在同一个函数块中跳转 第二,我们的传统非局部跳转函数,是线程不安全的 在这篇文章中,我们专注于对非局部跳转做简要的讨论。

我们要注意到的事情是,在我们的信号处理函数正在应对信号的时候,系统会自动将我们的处理函数所对应的信号,加入屏蔽信号组之中(这是出于安全考虑,避免出现一致性问题)

但是,如果在信号处理函数中,我们调动了传统的线程不安全的非局部跳转函数,那么,存在该信号一直处于屏蔽状态,程序失去对该信号应对处理能力的风险。

输入图片说明

(某种意义上,如果我们能够处理的信号一直被屏蔽,那么我们事实上的失去了应对它们的能力)

作为解决方案,Unix 提供了 sigsetjmpsiglongjmp 函数给我们,进而实现信号安全的非局部跳转。