我的问题涉及到在Windows中使用"cmd.exe"和"/c"执行Java子进程时的几个不理解的事情。基本上,我找不到一个好的解释说明何时以及为什么需要它们。
我的具体问题:我有一个用于执行子进程的小框架。其中一个用途是由ProcessBuilder创建的几个其他JVM的Java应用程序进行“管理”。其中一个关键要求是当子进程被卡住或托管应用程序正在终止时,必须能够杀死子进程。
问题在于,一方面,这样做:
new ProcessBuilder("java", "...").start();
导致这个的原因是:
Could not find or load main class ...
如果系统变量或目录不同(但它们并不不同)。另一方面,将它包装在cmd.exe中,如下所示:
new ProcessBuilder("cmd.exe", "/c", "java", "...").start();
这段代码是有效的,但创建了另一个cmd.exe进程,其副作用是:子JVM现在成为一个子子进程,而process.destroy();
无法将其杀死(我发现这是Windows JRE中已知的错误)。
这个特定的问题是在不同的级别上处理的,因为所有这些应用程序都是我们自己的,并且我们知道它们的PID。但这是一个例子,说明cmd.exe使所有事情都工作得与众不同(或防止JVM完全工作)。所以我想知道那里到底发生了什么。
在这里,框架本身也进入了图片。它也将被我们的测试平台使用。我想提供一个API,允许通过一个参数用cmd.exe /c包装命令。但是,这个参数究竟是什么意思?用户如何决定他们是否需要cmd.exe包装?
而且,我会很感激额外的奖励:这对其他操作系统有任何影响吗?例如,在Linux中是否有类似的等效物?