1

このコードを実行すると、呼び出しグラフが非常に大きいため、何も残っていないにもかかわらず、プログラムは出力する最後の行までopt出力され、でブロックされます。readLine誰が問題が何であるか知っていますか?opt -print-callgraph fileコール グラフをエラー ストリームに送信します。代わりにファイルから読み取ることができるように実行しようとopt -print-callgraph file 2> callgraphしましたが、位置引数が多すぎると不平を言います。

奇妙なことに、コードはサイズの小さいコール グラフでも問題なく実行されます。

私も使用ProcessBuilderしてみましたが、同じ問題が発生します。

Runtime runtime = Runtime.getRuntime();
Process process = runtime.exec("opt -print-callgraph " + file);
BufferedReader in = new BufferedReader(new InputStreamReader(process.getErrorStream()));
String s = null;
try {
    // Gets stuck at readLine after printing out the last line.
    while ((s = in.readLine()) != null) {
        System.out.println(s);
    }
} catch (Exception e) {
    e.printStackTrace();
} finally {
    in.close();
}
4

1 に答える 1

2

両方のストリームを別々のスレッドで読み取るか、それらをマージして両方を同時に読み取る必要があります。そうしないと、出力が消費されない場合にプロセスがブロックされる可能性があります。この場合、プロセスをブロックしている未消費の出力が必要です。stdoutこれは、プロセスが終了しないことを意味します。つまり、プロセスが閉じられないことstderr,を意味し、読み取りstderrがブロックされることを意味します。

于 2014-03-29T22:56:25.503 に答える