再帰を検出したい特定の関数 (シグナル ハンドラ) があります。つまり、関数が直接または間接的に自分自身を呼び出しているかどうかを調べます。注意が必要な点は、ある時点で関数がその制御下にないコードを呼び出し、そのコードが何でもできることです。
通常、私は次のようなものを書くだけです
void foo() {
static int recursed = 0;
if(recursed) {
...
}
recursed = 1;
othercode();
recursed = 0;
}
othercode
しかし、この場合、 a などを使用しlongjmp
て抜け出し、結果として 1 のままになる可能性があることを懸念していrecursed
ます。後で呼び出された場合の再帰 (それ以外の場合は、それがlongjmp
外れるという事実は問題ではありません)。
注:longjmp
可能性が高いと思います。これは、他のイン ザ ワイルド コードからのチェーン シグナル ハンドラであり、たとえば、コンテキストを復元するために使用othercode
するハンドラが存在します(たとえば、「障害保護」例外ハンドラとして)。同期シグナルハンドラでの使用は、一般的に安全であることに注意してください。いずれにせよ、他のコードが安全かどうかは特に気にしません。それは私の管理下にあるものではないからです。SIGSEGV
longjmp
longjmp