問題タブ [sigaction]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c - sigaction がコア ダンプを呼び出す理由
int sigaction(int signum, const struct sigaction *act, struct sigaction *oldact);
act が NULL でない場合、シグナル signum の新しいアクションは act からインストールされます。oldact が NULL でない場合、以前のアクションが oldact に保存されます。
これはhttps://linux.die.net/man/2/sigactionからのものです。「前のアクション」が何を意味するのかよくわかりません。と呼ばれるデフォルトでのアクションを意味しますsignum
か?以下のようにコードをテストしましたが、コアがダンプされました。
c - シグナルハンドラで TAILQ を歩く
TAILQ によってリンクされた構造のリストを維持するアプリケーションがあります。各構造体には、ダーティ ビットと、メモリ内の専用の特別なページへのポインターがあります。誰かがこれらのページのいずれかに書き込みを行っているかどうかを知る必要があるためmprotect
、PROT_READ
SEGV が検出されたときにオフになるシグナル ハンドラーをインストールします。
ハンドラーが呼び出されると、アドレスを取得し、リストを調べて、ページのいずれかで segv が発生したかどうかを確認します。発生した場合は、そのページをダーティとしてマークし、mprotect
書き込み可能にします。したがって、次のようになります。
シグナル ハンドラ内でリストを安全に処理できるか心配です。別のスレッドが SEGV を生成しているときに、あるスレッドがリストを変更している場合、未定義の動作が発生するのではないかと懸念しています。
スレッドがリストを変更するときにスレッドを徹底的に調べることができ、それが SEGV を生成しないことがわかっている場合、シグナル ハンドラでこのリストをトラバースする安全な方法はありますか? つまり、SEGV がオフになったときにリストが変更されていることを検出した場合、他のスレッドがリストの更新を完了するまでシグナル ハンドラをブロックする方法はありますか?
最後に、最後の質問です。状況によっては、シグナル ハンドラでリストを変更 (エントリの追加または削除) する必要がある場合があります。これを行う安全な方法はありますか?