2012-03-06 17 views
0

Javaプログラムから、指定したフォルダから入力を読み取り、gcovデータを生成するスクリプトを実行したい。このスクリプトはgcovデータの一部を正しく生成しますが、私のjavaプログラムを明示的に終了するまで残りのデータを生成することはできません。その後、期待どおりに仕事を完了します。スクリプトここ子プロセスと親プロセスの間でデッドロック状態が発生する

try { 
    Process proc = Runtime.getRuntime().exec("/bin/bash CovSeq.sh"); 
    proc.waitFor(); 

    System.out.println("Generated gcov Data");   
} catch(Exception e) { 
    System.err.println("Error: "+e.getMessage()); 
} 

されています:ここで

は、スクリプトを起動するコードであるあなたは、Javaから子プロセスを生成するとき

#!/bin/bash 
lines=($(cat path)) 
mkdir output 
mkdir gcovOut 
rm -f -r ./gcovOut/* 
rm -f -r ./output/* 
gcc -g -o temp_exec -fprofile-arcs -ftest-coverage ${lines[0]} 
path1=`pwd` 
cd ${lines[1]} 
for i in `ls *` 
do 
cd $path1 
./temp_exec < ${lines[1]}/$i > ./output/$i 
gcov -b -c ${lines[0]} 
mkdir ./gcovOut/$i 
mv *.gcov ./gcovOut/$i 
mv *.gcda ./gcovOut/$i 
cd ${lines[1]} 
done 

答えて

0

親プロセスが出力を消費しないため、スクリプトがブロックされている可能性があります。これはRuntime.exec()の既知の動作です。 Here is an example正しく使用する方法

+0

bufferreaderは私を助けます....問題解決... ....ありがとう – ankur

0

は、あなたがは、その標準出力を消費しなければならないおよび標準記述子を使用するか、これらのファイルがいっぱいであるために子プロセスがブロックされます。

これを行うにはいくつかの方法があります。スクリプト内では、すべての出力をファイルに送ることができます。あるいは、シェルコマンドを変更して、スクリプトからのすべての出力をファイルに送ることもできます。これらのアプローチのいずれかによって、消費する必要のある出力がないため、ブロックされないようになります。

Java側からこの問題を処理する場合は、スレッドを生成して子の標準出力ストリームと標準エラーストリームを表すInputStreamオブジェクトを読み取ることができます。必要に応じて、これらのデータをJavaプログラムで破棄、ログ記録、または解釈することができます。

+0

私は既に出力をリダイレクトしていますが、いくつかのgcovファイルを生成した後、ブロックされてしまい、親プロセスを明示的に終了したときだけファイルの生成を再開します。 – ankur

+0

@ankur実際に出力をリダイレクトしていますか?どうやって?あなたが投稿したコードのどれもがこのことを示していません。 – erickson

+0

私は自分のスクリプトでリダイレクトしていますが、bufferreaderは解決策です。問題は解決しました...ありがとう – ankur

関連する問題