- PR -

LinuxでのJVMの停止について

1
投稿者投稿内容
オアシス
会議室デビュー日: 2004/05/17
投稿数: 9
お住まい・勤務地: nagoya
投稿日時: 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言語の領域に少しはみ出していますが、ご存知のかたがいらっしゃいましたら、
ご教授お願いします。
Kissinger
ぬし
会議室デビュー日: 2002/04/30
投稿数: 428
お住まい・勤務地: 愛知県
投稿日時: 2005-01-07 20:33
オアシスさん、こんにちは。

念のため、kill関数に与えている pidは正しく Java VMを
示しているでしょうか?

system()はシェルを起動して、更にコマンドを起動してた
ような?

通常は SIGKILLは無視されないと思います。
私の経験では SIGKILLで終了しないのは、デバイスドライバ
から返って来ない時くらいです。
オアシス
会議室デビュー日: 2004/05/17
投稿数: 9
お住まい・勤務地: nagoya
投稿日時: 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)


Kissinger
ぬし
会議室デビュー日: 2002/04/30
投稿数: 428
お住まい・勤務地: 愛知県
投稿日時: 2005-01-12 02:20
つづきの疑問があったのですね。

Cのプログラムどうしで親を KILLすれば子も終了するのは
System関数から呼ばれたからだと思います。
forkとexecシステムコールで子プロセスを起動してやって
みれば、簡単にこの現象が起こりますよ。

system関数で Javaを起動したときですが、多分 javaコマ
ンド(ランチャ)内部で forkしてる個所があるのではない
でしょうか。(調べてません。間違ってたら教えて!)

(参考)
1. Java VMも Cで記述されたプログラムですよ。
2. ゾンビプロセス
1

スキルアップ/キャリアアップ(JOB@IT)