2

Java で ProcessBuilder を使用して Perl スクリプトを実行しています。プロセスの InputStream の出力中に Perl スクリプトを実行すると、Perl スクリプトの実行中に Java プログラムが実行されているように見えます。しかし、メインの getOutPut メソッドをコメントアウトすると、Java プログラムが非常に速く終了し、Perl スクリプトがまったく実行されません。なぜこれが起こるのですか?

private final static String SCENARIO =  "scen"; 

/**
 * @param args
 */
public static void main(String[] args) {


    ProcessBuilder pb = new ProcessBuilder("perl", SCENARIO+".pl");
    pb.directory(new File("t:/usr/aman/"+SCENARIO));
    try {
        Process p = pb.start();
        getOutput(p.getInputStream(), true);
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
}

private static List getOutput(InputStream is, boolean print) {
    List output = new ArrayList<String>();
    BufferedReader reader = new BufferedReader(new InputStreamReader(is));

    String s = null;
    try {
        while ((s = reader.readLine()) != null) {
            output.add(s);
            if(print){
                System.out.println(s);
            }
        }
        is.close();
    } catch (IOException e) {
        // TODO Auto-generated catch block
        //e.printStackTrace();
        return null;
    }
    return output;
}
4

1 に答える 1

2

PERL スクリプト プロセスの OS の出力ストリーム バッファがいっぱいになる可能性があります。これは、このバッファを空にするものが何もないためです。これにより、プロセスが強制終了されます。このため、出力ストリームをむさぼり食う必要があります。これは、 getOutput メソッドが行うことです。

この問題に関する古典的なリファレンスを読んください: When Runtime.exec() won't . この記事によると:

一部のネイティブ プラットフォームでは、標準の入力ストリームと出力ストリームに対して限られたバッファー サイズしか提供されないため、サブプロセスの入力ストリームの書き込みまたは出力ストリームの読み取りが迅速に行われないと、サブプロセスがブロックされたり、デッドロックが発生したりする可能性があります。

于 2013-04-26T21:08:53.717 に答える