私は再帰を検出したい、つまりその関数が直接的または間接的に呼び出されたかどうかを調べる特定の関数(シグナルハンドラ)を持っています。面倒なことに、関数はある時点では制御できないコードを呼び出し、そのコードは何かを行うことができます。非局所ジャンプがあっても堅牢な再帰を検出する
通常、私はちょうど
void foo() {
static int recursed = 0;
if(recursed) {
...
}
recursed = 1;
othercode();
recursed = 0;
}
ような何かを書くと思いますが、この場合には、私はothercode
は1.に残っrecursed
その結果、longjmp
または抜け出すに類似を使用することができることを心配します私の関数がこのように飛び出された場合、後で呼び出されると再帰的に見えないようにしたい(実際にはlongjmp
'は問題ありません)。
:longjmp
と思われます。 othercode
は、他のいくつかのin-the-wildコードからの連鎖シグナルハンドラであり、例えば次のようなハンドラが存在します。 SIGSEGV
は、文脈を復元するためにlongjmp
を使用する(例えば、「障害保護」例外ハンドラとして)。同期シグナルハンドラでlongjmp
を使用することは一般的に安全です。いずれにしても、他のコードが安全であるかどうかは特に気にしません。なぜなら、私の制御下にあるものではないからです。
あなたは 'longjmp'の可能性が高いと心配していますか、それとも可能性がありますか? – Patashu
@パタシ:そうです。私の編集を参照してください。 – nneonneo
質問タイトルは、「longjmpを使用しても再入室を検出する」のような、少し具体的に編集する必要があります。 – Patashu