如何closuresWindows上的Javasubprocess标准输出文件描述符,而后代仍然存在

给定一个简单的batch filec1.bat,其中包含:

start notepad 1> nul 2> nul exit

一个Java程序:

import java.io.InputStream; public class Processtest { public static void main(String[] args) throws Exception { ProcessBuilder b = new ProcessBuilder(); b.command("c1.bat"); Process p = b.start(); new Thread(new ProcDrain(p)).start(); System.out.println("Parent process finished: " + p.waitFor()); } private static class ProcDrain implements Runnable { private final Process p; private ProcDrain (Process p) { this.p = p; } @Override public void run() { try { InputStream in = p.getInputStream(); while (in.read() >= 0) { } System.out.println("Inputstream drainer finished"); } catch (Exception e) { throw new RuntimeException(e); } } } }

执行c1.bat的第一个进程立即结束了另一个进程(记事本)。 然而,排水线程在read()调用中被阻塞,并且在记事本closures之前不会终止。 这表明记事本保持打开原始进程的stdout文件描述符,尽pipebatch file已经redirect了它。

有没有一些方法让batch fileclosuresstdout / stderr文件描述符,以便一旦生成的进程实际退出,drainer线程不会在read()上阻塞?

PHP进程内存和cpu使用率(Windows)

如何在VB6中执行进一步的代码之前等待shell进程完成

在C#中运行命令行参数

variables获取Windows目录在x64位版本?

Linux:我可以在不使用任何IPC(pipe道等)的情况下读取另一个进程的输出吗?

读取subprocess的输出尽快有一些可用?

为Windows x64预编译的sqlite二进制文件

在同一进程中创build的所有其他线程之后停止线程

VBS Windows 64位/ 32位registry读取问题

查看Tomcatsubprocess的详细信息

相关文章

HashMap是Java中最常用的集合类框架,也是Java语言中非常典型...
在EffectiveJava中的第 36条中建议 用 EnumSet 替代位字段,...
介绍 注解是JDK1.5版本开始引入的一个特性,用于对代码进行说...
介绍 LinkedList同时实现了List接口和Deque接口,也就是说它...
介绍 TreeSet和TreeMap在Java里有着相同的实现,前者仅仅是对...
HashMap为什么线程不安全 put的不安全 由于多线程对HashMap进...