4

最後の命令として exit() を呼び出すシグナル ハンドラーを考えてみましょう。そのハンドラーで再入不可関数 (free() など) を呼び出しても安全ですか?

IMHOハンドラーが通常の実行シーケンスに戻らないという事実により、それは合法です。

前もって感謝します。

4

3 に答える 3

6

いいえ、これは違法です。それ以上に、呼び出す安全な関数はほとんどありません。

呼び出す安全な関数のリストがあります。http://linux.die.net/man/2/signal注のセクションを参照してください。

于 2009-11-10T11:24:47.983 に答える
1

2 つのシグナルを区別する必要があります。デーモンに「リロード」するよう指示するシグナルと、デーモンを終了させるシグナル (「kill」) です。「kill」の場合、何も解放する必要はありません。あなたのプロセスは死ぬでしょう、OSはあなたが割り当てたものをすべてクリーンアップします。共有メモリを使用する場合は、再起動時にクリーンアップを行う必要があります。問題を引き起こす可能性のある "kill" ハンドラで何もしないでください。ただ死ぬ。

リロードの場合、ユーザーは「正常にシャットダウンする」ことを望んでいるため、好きな関数を呼び出すことができます。この場合、同じシグナルを再び受け取る可能性はほとんどありません (したがって、関数が再入可能かどうかは問題ではありません)。

于 2009-11-10T12:27:04.050 に答える
0

関数への「入口」と関係がある再入可能性、および出口よりも前記関数によって維持される副作用と状態...

このマニュアルページを参照することをお勧めします。

于 2009-11-10T11:25:23.920 に答える