6

このhack.cプログラムを考えると:

#include <stdio.h>
main()
{
 int i=0;
 for(i=0; i<100; i++) {
   printf("%d\n", i);
   sleep(5);
 }
}

そしてこのhack.shbashスクリプト:

#!/bin/bash
./hack

hack.shを実行すると、2つのプロセスが作成されます。1つはbash用、もう1つはCタスク用です。TERMシグナルがbashプロセスに送信されても​​、Cプロセスは無傷です。

ここで、元のbashがRuntime.exec()を使用してJavaプログラムから起動されたとすると、それを制御できるのはProcess.destroy()(TERMをbashプロセスに送信する)だけですか?Cプロセスを起動したbashと一緒に終了させたいとしましょう。

私はbashでこのようなことを試みてきました:

#!/bin/bash
trap "kill -TERM -$$; exit" TERM
./hack

つまり、TERMシグナルをキャッチし、それをプロセスグループ全体に再ブロードキャストするトラップ句。これは私には機能しません-そのトラップ句を含むbashプロセスはTERMシグナルを無視します。

ここで何が欠けていますか?

4

1 に答える 1

10

次の行に沿って何かを試すことができます。

#!/bin/bash
./hack &
pid=$!
trap "kill $pid" TERM
wait $pid

これを行う方が簡単(かつ同等)かもしれません:

#!/bin/bash
./hack &
trap "kill $!" TERM
wait

トラップの二重引用符は、トラップが定義されているときに単語展開を発生させる必要があるため、 $! の値を変更します。影響を与えるべきではありません。しかし、私は最初のバージョンの方が好きです。

于 2009-10-06T17:05:25.877 に答える