javaにおけるサブプロセスの待ち方
以下のコードで問題が起きました。
javaからサブプロセスを読んで、サブプロセスの標準出力から
文字列を取得するプログラムです。
//Inter.java
import java.io.*;
public class Inter
{
static final int A = 10;
public static void main(String[] arg)
{
String out = "Initial";
int c;
Runtime rt = Runtime.getRuntime();
try{
Process ps = rt.exec("process.exe");
BufferedReader br = new BufferedReader(new InputStreamReader(ps.getInputStream()));
System.out.println("Debug:OK");
for(c=0;c < A;c++)//ポイント1
{
out = br.readLine();
System.out.println("java:" + out);
}
out = Integer.toString(ps.waitFor());//ポイント2
System.out.println("終了コード:" + out);
}catch(Exception ex){
System.out.println("エラー");
}
System.out.println("正常終了");
}
}
一方呼び出されるサブプロセスは
//process.c
//compiled to process.exe
#include <stdio.h>
int main ()
{
int i,k,n;
for(i=0;i<100;i++)
{
printf("test%d\n",i);
}
return 235;
}
ここで、java側のコードの定数Aを1以上に設定るると期待どおりの結果が出るのですがA=0つまり、for文に一度も入らず、標準出力のストリームから文字列を一度も読まないとフリーズします。どうやら
out = Integer.toString(ps.waitFor());//ポイント2
の部分で止まるようです。これはなぜでしょうか?これでは、標準出力があるサブプロセスの終了コードだけ知りたい時に不便ではないですか?これはもしやjava言語システムのバグではないでしょうか!waitFor()メソッドの実装が観たいのですがあいにくnativeキーワードがあるメソッドで手元のソースだけではでは中身がわかりません。nativeのさらに中の実装は見ることはできないのでしょうか?