web-dev-qa-db-ja.com

シグナルハンドラーを設定するラッパープログラム

特定のコマンドを実行し、コマンドが指定された信号を受信したときに実行されるように信号ハンドラーを設定するラッパープログラムが必要です。

質問はこれです:

  1. これを行うためのユーティリティプログラムはありますか?
  2. そうでない場合、bashのコマンドtrapおよびexecを使用してこれを行うことは可能ですか?
  3. そうでない場合、どうすればこれを行うことができますか? (例えば、いくつかのシステムコールを行うCで自分でプログラムを書くことによって)

編集:ターゲットプラットフォームはGNU/Linuxです。

編集2:Ignacioの答えに従って、私はなんとかプリロードSOのように見えます this

5
Pteromys

できません。 exec(3p)のマニュアルページから:

呼び出し元のプロセスイメージによってキャッチされるように設定された信号は、新しいプロセスイメージのデフォルトのアクションに設定されます。

プログラムが開始する前にシグナルハンドラーをフックするプリロードSOを作成する必要があります。

シグナルを無視することしかできません(_SIG_IGN_);シェル(trap)またはCプログラム(signal(2))からシグナルハンドラーを提供することはできません。 execが呼び出されると、すべてのシグナルハンドラが置き換えられます。

例:

_:
trap "" 1 2
exec sleep 100000
_

次に、バックグラウンドまたはフォアでプログラムを呼び出し、SIGHUPまたはSIGINTのいずれかをプログラムに送信します。無視されます。コードをトラップに入れると、execでシグナルがリセットされます。

_:
trap "echo signal caught" 1 2
exec sleep 10000
_

これは、シグナルを送信した「シグナルキャッチ」を出力しませんが、実際にはプログラムを終了します。

1
Arcege