【问题标题】:Process getInputStream() never ends进程 getInputStream() 永远不会结束
【发布时间】:2016-03-15 15:54:31
【问题描述】:

在我的程序中,我试图通过 Java 代码执行 make

这是我列表的一部分:

this.makefileGenerator.generate();

Process proc = this.makefileGenerator.runCompiler();

//this.stream.println(IOUtils.toString(proc.getInputStream()));
BufferedReader reader = new BufferedReader(new InputStreamReader(proc.getInputStream()));
String line;
while ((line = reader.readLine()) != null)
    System.out.println("\n" + line);

try {
    int result;

    if ((result=proc.waitFor()) == 0)
        this.stream.println("Done!");
    else {

执行似乎在proc.getInputStream() 调用期间被阻止。事实上,我的程序不会崩溃,但永远不会终止。

在控制台输出中我有:

make: Entering directory '/cygdrive/c/Users/cr01046/Documents/workspace/ocelot/jni'
gcc -shared -m32 -D__int64=int64_t -LC:/gtk/lib -lintl -mms-bitfields -IC:/gtk/include/glib-2.0 -IC:/gtk/lib/glib-2.0/include  -IC:/'Program Files'/Java/jdk1.8.0_73/include -IC:/'Program Files'/Java/jdk1.8.0_73/include/win32  -o ../Test.dll  lists.c ocelot.c EN_CBridge.c main.c -lglib-2.0  

我还尝试通过提示抛出make,编译正确终止(但是,有几个警告)。我不明白为什么在这种情况下 make 可以工作,而通过 Java 它不会终止。

【问题讨论】:

  • 你怎么知道它被getInputStream()屏蔽了?我会将这组嵌套调用拆分为单独的语句,以确认它被阻止的位置。
  • 您的System.out.println 指令似乎有效,因此问题不在读者创建部分。

标签: java makefile


【解决方案1】:

如果您的编译生成警告,但在从 Java 运行时看不到警告,则警告将写入 STDERR,您不会使用 STDERR。根据错误输出的数量,当缓冲区满时,make 进程可能会停止。

如果Process 是使用ProcessBuilder 创建的,那么您应该调用redirectErrorStream(true) 将错误输出与标准输出合并。

【讨论】:

  • 我的make 进程实际上因 STDERR 上的大量警告而停滞不前。谢谢解释
猜你喜欢
  • 2014-11-26
  • 2019-06-08
  • 1970-01-01
  • 1970-01-01
  • 2021-05-17
  • 2013-04-09
  • 2010-12-27
  • 1970-01-01
  • 2021-08-05
相关资源
最近更新 更多