Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/400.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java中Process.destroy()之后,stderr/stdout流会发生什么变化?_Java_Process - Fatal编程技术网

Java中Process.destroy()之后,stderr/stdout流会发生什么变化?

Java中Process.destroy()之后,stderr/stdout流会发生什么变化?,java,process,Java,Process,我希望对从Java启动的进程有一个超时。超时后,我想终止进程。到目前为止,一切顺利。问题是,我想在正常执行期间和超时之后捕获stderr/stdout。如果使用destroy()终止进程,会发生什么情况?我可以检索到目前为止生成的(部分)stderr/stdout吗?或者它们消失了?除了调用Process.exec()/waitFor()/destroy()的线程之外,还应该有一个或两个单独的线程读取stdout和stderr(如果合并它们,则一个)。读取线程将获取在EOF之前生成的任何数据。如

我希望对从Java启动的进程有一个超时。超时后,我想终止进程。到目前为止,一切顺利。问题是,我想在正常执行期间和超时之后捕获stderr/stdout。如果使用destroy()终止进程,会发生什么情况?我可以检索到目前为止生成的(部分)stderr/stdout吗?或者它们消失了?

除了调用
Process.exec()/waitFor()/destroy()
的线程之外,还应该有一个或两个单独的线程读取
stdout
stderr
(如果合并它们,则一个)。读取线程将获取在EOF之前生成的任何数据。如果调用
Process.destroy()
,EOF可能会更快发生,仅此而已。

进程处理本质上是特定于操作系统的,我在这里专门介绍Java如何处理Unix进程

不幸的是。我不知道为什么JDK设计者认为这是正确的设计模式,但它确实使处理终止的进程变得更加复杂

值得注意的是,
InputStream
s
进程
包含的实例实际上有一个
drainInputStream()
方法,该方法完全满足我们的需要—它读取备份文件描述符中的任何剩余字节,并将它们存储在字节缓冲区中。此方法“在进程退出时由进程收割机线程调用”,但不幸的是,当进程被
.destroy()
调用时,此方法未被调用


那么,您所能期望的最好方法就是在调用
.destroy()
之前,检查您自己的
drainInputStream()
行为,并对
stdout
stderr
调用该行为。在您排空数据流之后,但在
.destroy()
完成之前,仍有可能将某些数据写入任一流中,但这将获得大部分数据。

您如何读取stdout和stderr?它们怎么会有“部分”输出呢?当进程超时,我杀死它时,会有部分结果。但是,我仍然想捕获它们以备日后调查。是的,但是如果我只是终止进程,然后尝试收集stderr/stdout,会发生什么呢?这是我的问题。你会按错误的顺序做事,就是这样。在多线程、多核环境中,“顺序”是什么?因此我的问题是,这是你的命令。你说你正在“杀死进程,然后试图收集stdin/stdout”。这是一个命令,这是一个错误的命令。照我上面说的做。关于Process.exec()的缺陷,有一篇很好的Javaworld文章。对不起,没有手的参考号,我同意。糟糕的决定。他们应该让输入蒸汽输送到流的末端,而输出蒸汽输送“断管”,就像插座一样,