从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 :(得分:0)
当您从Java生成子进程时,必须使用其标准输出和标准描述符,否则子进程将阻塞,因为这些文件已满。
有几种方法可以做到这一点。在脚本中,您可以将所有输出定向到文件。或者,您可以更改shell命令以将脚本的所有输出定向到文件。这些方法中的任何一种都使得没有需要消耗的输出,因此没有阻塞。
如果您希望从Java端处理此问题,则可以生成线程以读取表示子级标准输出和标准错误流的InputStream
对象。您可以根据需要在Java程序中丢弃,记录或解释这些数据。
答案 1 :(得分:0)
我敢打赌,脚本被阻止了,因为父进程没有消耗它的输出。这是Runtime.exec()
的已知行为。 Here is an example如何正确使用它。