2012-03-06 94 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()); 
} 

這裏是腳本:

#!/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 2012-03-07 15:45:13

0

當你從Java生成一個子進程,你必須消耗它的標準輸出標準描述符,或者子進程將因爲這些文件已滿而阻塞。

有幾種方法可以做到這一點。在腳本中,您可以將所有輸出指向文件。或者,您可以更改shell命令以將腳本的所有輸出指向文件。這些方法中的任何一種都可以使得沒有需要消耗的輸出,因此沒有阻塞。

如果您寧願從Java端處理此問題,則可以生成線程以讀取表示子標準輸出和標準錯誤流的InputStream對象。您可以根據需要在Java程序中放棄,記錄或解釋這些數據。

+0

我已經重定向我的輸出,但生成一些gcov文件後,它被阻止,然後它恢復生成的文件,只有當我明確地終止父進程 – ankur 2012-03-07 13:38:48

+0

@ankur你真的重定向輸出?怎麼樣?您發佈的任何代碼都不會顯示這種情況。 – erickson 2012-03-07 15:32:12

+0

我正在重定向到我的腳本中,bufferreader是解決方案,問題已解決......謝謝 – ankur 2012-03-07 15:47:42