Java 子进程和父进程之间出现死锁情况

Java 子进程和父进程之间出现死锁情况,java,Java,我想从一个java程序中执行一个脚本,从指定的文件夹中读取输入并生成gcov数据。该脚本正确地生成了部分gcov数据,但在我明确终止java程序之前无法生成其余数据,在此之后,它将按预期完成其工作 以下是启动脚本的代码: try { Process proc = Runtime.getRuntime().exec("/bin/bash CovSeq.sh"); proc.waitFor(); System.out.println("Generated gcov Data

我想从一个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
行=($(cat路径))
mkdir输出
mkdir gcovOut
rm-f-r./gcovOut/*
rm-f-r./output/*
gcc-g-o temp_exec-fprofile arcs-ftest coverage${lines[0]}
路径1=`pwd`
cd${lines[1]}
因为我在*`
做
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]}
完成

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

有几种方法可以做到这一点。在脚本中,可以将所有输出定向到一个文件。或者,您可以更改shell命令,将脚本中的所有输出定向到一个文件。这两种方法中的任何一种都可以避免需要消耗的输出,从而避免阻塞


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

我打赌脚本被阻止是因为父进程不使用其输出。这是
Runtime.exec()
的已知行为。如何正确使用它。

我已经在重定向我的输出,但在生成一些gcov文件后,它被阻止,然后只有在我显式终止父文件时,它才恢复生成文件process@ankur你真的在重定向输出吗?怎么用?您发布的代码都没有显示这种情况。我正在脚本中重定向,bufferreader是解决方案,问题已解决。。。thanks@ankur如果
BufferedReader
是“解决方案”,则证明您没有重定向所有输出(
BufferedReader
如果是,则没有任何内容可读取)。并不是您正在使用一个
BufferedReader
,而是您现在正在使用脚本的输出,以便它不会阻塞。