- - PR -
LinuxでのJVMの停止について
1
投稿者 | 投稿内容 |
---|---|
|
投稿日時: 2005-01-07 18:58
Linux上でC言語のsystem関数を使用しjavaを起動するシステムを製作しています。
例)iRet = system(java クラス名 パラメータ) このプロセスを起動後、killを使用して強制終了をかけたいのですが 例)kill(pid,SIGKILL) C言語のプロセスは終了するのですが、JVMは死なずそのまま動作しています。 Linux上でCからJVMを終了させることはできないのでしょうか? ちなみにコマンドラインからだとkill -9 プロセスIDで強制終了可能です。 <環境> OS:RedHat AS3.0 JDK:1.4.2_05 C言語の領域に少しはみ出していますが、ご存知のかたがいらっしゃいましたら、 ご教授お願いします。 |
|
投稿日時: 2005-01-07 20:33
オアシスさん、こんにちは。
念のため、kill関数に与えている pidは正しく Java VMを 示しているでしょうか? system()はシェルを起動して、更にコマンドを起動してた ような? 通常は SIGKILLは無視されないと思います。 私の経験では SIGKILLで終了しないのは、デバイスドライバ から返って来ない時くらいです。 |
|
投稿日時: 2005-01-10 09:41
Kissingerさん、回答ありがとうございます。
kill関数に与えているpidはJVMをさしていなかった為 強制終了できていませんでした。JVMのpidを指定すれば正しく終了します。 ご指摘通りでした。 ここで関連した疑問なのですがCのプロセス通しだと親プロセスをkillすれば 子プロセスも同時に終了するのですが今回のようにsystemでjavaを呼出したときには JVMからメッセージが吐かれるだけで終了はしないです。 C〜Java間だと親子関係ができていないんでしょうか? (参考までにメッセージの内容抜粋) Full thread dump Java HotSpot(TM) Client VM (1.4.2_05-b04 mixed mode): "Signal Dispatcher" daemon prio=1 tid=0x08096478 nid=0x6b11 waiting on condition [0..0] "Finalizer" daemon prio=1 tid=0x08092ab8 nid=0x6b11 in Object.wait() [aad3d000..aad3d87c] at java.lang.Object.wait(Native Method) - waiting on <0xaaec0490> (a java.lang.ref.ReferenceQueue$Lock) at java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:111) - locked <0xaaec0490> (a java.lang.ref.ReferenceQueue$Lock) at java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:127) at java.lang.ref.Finalizer$FinalizerThread.run(Finalizer.java:159) |
|
投稿日時: 2005-01-12 02:20
つづきの疑問があったのですね。
Cのプログラムどうしで親を KILLすれば子も終了するのは System関数から呼ばれたからだと思います。 forkとexecシステムコールで子プロセスを起動してやって みれば、簡単にこの現象が起こりますよ。 system関数で Javaを起動したときですが、多分 javaコマ ンド(ランチャ)内部で forkしてる個所があるのではない でしょうか。(調べてません。間違ってたら教えて!) (参考) 1. Java VMも Cで記述されたプログラムですよ。 2. ゾンビプロセス |
1