当前位置: 首页 > 面试题库 >

为什么Process.waitFor()永不返回?

牟飞沉
2023-03-14
问题内容

我正在通过以下方式从Java代码启动Windows进程(用C ++编写,但没有源代码):

 Process p1 = Runtime.getRuntime().exec(cmdAndParams);
 p1.waitFor();

我的问题是,waitFor()方法永远不会结束。因此,我尝试在一个简单的shell中启动该过程,并以shell中的许多打印正确结束(我猜是标准输出)。

因此,即使我现在不需要这些输出,我还是决定创建并启动一个读取标准输出的线程。这解决了问题。

因此,我的问题是以下问题:该解决方案是“启动并等待具有输出的外部进程的Java标准”,还是意味着本机进程中存在某个问题?如果存在这样的问题,那么问题的根源可能是什么C
++编程“错误”?


问题答案:

这是操作系统的事情。子进程正在写入stdout,并且正在缓冲它,以等待Java进程读取它。当您不读取它时,缓冲区最终将填满,并且子进程将阻止写入标准输出以等待缓冲区空间。

无论使用哪种语言,您都必须处理子进程的stdout(和stderr)。

我建议您阅读本文(共4页)并在此处实施建议。



 类似资料:
  • 问题内容: 问题答案: 有很多原因不回来。 但这通常归结为以下事实:执行的命令不会退出。 同样,这可能有很多原因。 一个普遍的原因是该过程产生了一些输出,而你没有从适当的流中读取。这意味着一旦缓冲区已满,进程就会被阻塞,并等待你的进程继续读取。你的进程依次等待另一个进程完成(之所以不会,是因为它等待你的进程,…)。这是一个典型的僵局情况。 你需要不断从流程输入流中读取内容,以确保它不会被阻塞。

  • 问题内容: 抱歉,这听起来太简单了。我是Java的新手。 这是我用来检查的一些简单代码。当我运行它时,我无法停止它。我以为如果不写任何输入并按,就可以避免循环。 有人可以向我解释在这种情况下如何工作吗? 问题答案: 从System.in读取时,默认情况下是从键盘读取的,这是一个无限的输入流……它的行数与用户希望输入的行数相同。我认为发送EOF的控制序列可能会起作用,例如CTL-Z(或者是CTL-D

  • 我在客户端使用vue、vue路由器,在服务器端使用express、morgan(MEVN应用程序) 在客户端我用vue cookie设置cookie 在服务器端,我使用CookieParser 所以,在应用程序。我有这样的代码 并且,在文件中,我有这样一个GET请求的代码 问题是,var loginHash=req.cookies['Login'];总是返回未定义的,即使我有登录cookie 添加

  • 当我试图对泛型类型执行TypedQuery时,我会从Eclipse得到一个未检查的类型转换警告。 我在这里使用泛型,因为在数据集中,由于查询和编辑的时间限制,每年都必须分离到不同的表中。表中有118年的数据(自1900年以来),我希望构建一个可以使用Java Reflections API每年扩展自己的系统。但是,这意味着在编译之前,我的父类不知道它们将对哪个子类或表进行操作。 下面是一些代码的示

  • 问题内容: 以下是ajax请求。 这就是delete.php 运行代码后,它将成功删除文件,但不会显示任何消息。 我也尝试将ajax请求更改为: 仍然不显示该消息。所以我想在delete.php文件中出了点问题。请帮忙。 问题答案: 进行jquery + ajax + php的最佳方法如下: jQuery的: PHP:

  • 根据JSON规范,表示null值的正确方法是文字。 预期结果: 实际结果: