テスト シナリオは、IP に ping を送信し、代わりにスクリプトから ctr+C を呼び出します。
シグナル ハンドラが呼び出されたとき、ping は malloc 内にあったようです。シグナル ハンドラーは malloc も呼び出し、malloc は以下の警告と共に返されました。malloc(): 警告: 再帰呼び出し
しかし、それでもクラッシュの原因を見つけることができませんでした。誰か説明してもらえますか
テスト シナリオは、IP に ping を送信し、代わりにスクリプトから ctr+C を呼び出します。
シグナル ハンドラが呼び出されたとき、ping は malloc 内にあったようです。シグナル ハンドラーは malloc も呼び出し、malloc は以下の警告と共に返されました。malloc(): 警告: 再帰呼び出し
しかし、それでもクラッシュの原因を見つけることができませんでした。誰か説明してもらえますか
ああ、リエントラントではない関数の問題を使用する恐ろしいシグナル ハンドラーです。
問題は、*BSDping
の機能追加メンテナーが、最初から安全に物事を行うことに力を入れていなかったことです。
FreeBSD は 1994 年にこの問題を追加し、1996 年にそれに気づき、1998 年に最終的な修正を行って、問題を修正するための実際よりもはるかに短い道のりを開始しました。
OpenBSD は 1997 年にこの問題を追加し、2002 年に気づきましたが、問題の本質を完全に見逃しており、2015 年まで適切かつ完全に修正されませんでした。
NetBSD は 1996 年にこの問題を追加しましたが、お気づきのように、まだ修正されていません。NetBSD はおそらく OpenBSD ping をインポートするはずです。
問題は、シグナル ハンドラで使用されるすべてのコードの必要性である、malloc()
STDIO (を含む) のいずれも再入可能ではないことです。printf()
再入可能性、シグナルハンドラーの問題などの説明を見つけるのに適した場所はたくさんありますが、おそらくこの質問とその受け入れられた回答 (および関連する質問のいくつか) が良い出発点になるでしょう: