儿童和父母进程之间出现死锁情况

时间:2012-03-06 20:10:59

标签: java

从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

2 个答案:

答案 0 :(得分:0)

当您从Java生成子进程时,必须使用其标准输出标准描述符,否则子进程将阻塞,因为这些文件已满。

有几种方法可以做到这一点。在脚本中,您可以将所有输出定向到文件。或者,您可以更改shell命令以将脚本的所有输出定向到文件。这些方法中的任何一种都使得没有需要消耗的输出,因此没有阻塞。

如果您希望从Java端处理此问题,则可以生成线程以读取表示子级标准输出和标准错误流的InputStream对象。您可以根据需要在Java程序中丢弃,记录或解释这些数据。

答案 1 :(得分:0)

我敢打赌,脚本被阻止了,因为父进程没有消耗它的输出。这是Runtime.exec()的已知行为。 Here is an example如何正确使用它。