2012-03-06 49 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

相关问题