C
プラグイン ライブラリを使用して低レベルの Linux カーネル ドライバーと対話するユーザー空間アプリケーションを作成しましたplugin.so
。を使用して DLL を開きますdlopen()
。dlclose()
を受信したときに呼び出すシグナル ハンドラがありますSIGINT
。dlclose()
コード レビューの後、シグナル ハンドラから呼び出してはならないというフィードバック コメントを受け取りました。はいの場合、なぜそうなのですか?
質問する
458 次
1 に答える
4
まず第一にdlclose()
、シグナルハンドラで安全に呼び出される関数の POSIX リストにリストされていないためです。
この理由は主に、そこにリストされていない関数の多くが、シグナル ハンドラと競合状態になる可能性のあることを行う必要があるメモリの割り当てなどを行う可能性があるためです。1 つの例は、ロックを保持することです。したがって、malloc/dlclose などに属するロックを現在保持しているスレッドにシグナルが到着し、その関数を呼び出すと、ロックは既にロックされていますが、ロックが解除されることはありません。スレッドは現在シグナルハンドラーにあり、「正常に」実行されていません。
于 2013-02-13T11:03:37.597 に答える