我有一个特定的函数(信号处理程序),我想检测它的递归,即确定该函数是否直接或间接调用了它自己。棘手的一点是,该函数在某一时刻调用了一些不受其控制的代码,而该代码可以做任何事情。
通常,我会写一些类似的东西
void foo() {
static int recursed = 0;
if(recursed) {
...
}
recursed = 1;
othercode();
recursed = 0;
}
但在这种情况下,我担心othercode
可能会使用 alongjmp
或类似来突破,导致recursed
保持为 1。如果我的函数以这种方式跳出,我想确保它不会将自己视为递归 if 稍后被调用(longjmp
否则它不是问题的事实)。
注:我认为longjmp
有可能。这othercode
是来自其他一些野外代码的链接信号处理程序,并且确实存在用于恢复上下文的处理程序SIGSEGV
(longjmp
例如,作为“故障保护”异常处理程序)。请注意,longjmp
在同步信号处理程序中使用通常是安全的。无论如何,我并不特别关心其他代码是否安全,因为它不在我的控制之下。