katsuhiro -> katsuhiro/refmon -> katsuhiro/refmon/signal

シグナル周りのエミュレーション

最低でも sigaction でシグナルハンドラが指定されたかどうか、停止を引き起こすシグナルのデフォルト処理、SIGKILL あるいは SIGCONT による強制的な実行再開の 3つはエミュレートしないとだめなようだ。

シグナルのエミュレーションがないと起こる問題

実装でつまづいた点

実装

メモ

シグナルを受け取る順番

リアルタイムシグナルを除くと、シグナルは若い番号から受け取られていく。

sigaction と sigprocmask

自分自身良くわかってなかったのでメモしておく。

sigprocmask でマスクしたときは、そもそもシグナルがカーネルからプロセスに送信されないのでリファレンスモニタにもシグナルが届かない。

sigaction で無視にしたときはカーネルからプロセスに送信されるが、プロセス側で何もしないで捨てるというだけなので、リファレンスモニタにもシグナル自体は届く。そのため、SIGSTOP や SIGCONT のような wait と関わるシグナルと、SIGTSTP, SIGTTOU, SIGTTIN などに設定されたハンドラは記録しておかなければいけない。

clone のシグナルハンドラのテーブルを共有する処理をエミュレーションする必要がありそう。

シグナルで割り込まれたシステムコールの問題

謎の現象

監視しているプロセスに kill で以下のシグナルを送ると、リファレンスモニタが 2回同じシグナルをキャッチする。なぜ?

デフォルトの動作が Stop のシグナルがあやしいのかと思ったが、そんなわけもなく。以下は正常にキャッチされるシグナルである。


トップ   編集 凍結 差分 履歴 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2014-09-13 (土) 08:26:39