使用exec启动其他进程时可能出现的问题

原创 2006年06月17日 12:46:00

java程序中用Runtime.getRuntime().exec()启动别的运行程序Pro2并调用waitFor()
   等待其运行结束时,如果Pro2程序向标准输出或错误信息输出端打印信息的话,可能
   导致Pro2不能正常运行(比如图形界面无法显示必须等到父程序退出时才能显示)。
   这可能是由于这些信息阻塞了程序,将这些信息读掉是一个不怎么好的办法,下面是
   一个实例,不过有漏洞。

   execProcess = Runtime.getRuntime().exec(pro2);

   InputStream stderr = null;
   InputStream stdin = null;
   byte[] buf = new byte[1024];
   int len1 = 0, len2 = 0;

   stdin = execProcess.getInputStream();
   stderr = execProcess.getErrorStream();
   while ( (len1 = stdin.available()) > 0 ||
           (len2 = stderr.available()) > 0) { //可能某个时刻恰好都没有,但程序后面会产生
        while (len1 > 0) {
             if (len1 > 1024) {
                 stdin.read(buf, 0, 1024); //也可能会发生阻塞
                 len1 -= 1024;
             }
             else {
                 stdin.read(buf, 0, len1); //也可能会发生阻塞
                 len1 = 0;
             }
        }
        while (len2 > 0) {
            if (len2 > 1024) {
                stderr.read(buf, 0, 1024); //也可能会发生阻塞
                len2 -= 1024;
            }
            else {
                stderr.read(buf, 0, len2); //也可能会发生阻塞
                len2 = 0;
            }
        }
   }
   stderr.close();
   stdin.close();

   execProcess.waitFor();

将pro2的输出重定位到某个文件(比如日志文件),可能能更好地解决这个问题

相关文章推荐

Linux启动新进程的几种方法及比较

有时候,我们需要在自己的程序(进程)中启动另一个程序(进程)来帮助我们完成一些工作,那么我们需要怎么才能在自己的进程中启动其他的进程呢?在Linux中提供了不少的方法来实现这一点,下面就来介绍一个这些...
  • ljianhui
  • ljianhui
  • 2013年08月20日 00:15
  • 39722

启动进程:exec函数族

(一) 说是exec系统调用,实际上在Linux中,并不存在一个exec()的函数形式,exec指的是一组函数,一共有6个,分别是:        (1)int execl(const ...

Linux系统进程控制编程(三)——exec函数族的使用

作者:zieckey (http://zieckey.cublog.cn)     All Rights Reserved! exec用被执行的程序完全替换调用它的程序的影像。fork创建一个...
  • diy534
  • diy534
  • 2011年11月13日 04:09
  • 239

Linux下的多进程编程——fork(),exec()等函数的使用

Linux下的多进程编程初步 1 引言 对于没有接触过Unix/Linux操作系统的人来说,fork是最难理解的概念之一:它执行一次却返回两个值。fork函数是Unix系统最杰出的成就...
  • hq0520
  • hq0520
  • 2011年05月23日 11:02
  • 2604

使用FD_CLOEXEC实现close-on-exec,关闭子进程无用文件描述符

我们经常会碰到需要fork子进程的情况,而且子进程很可能会继续exec新的程序。这就不得不提到子进程中无用文件描述符的问题! fork函数的使用本不是这里讨论的话题,但必须提一下的是:子进程...

使用Apache Commons Exec管理进程

网上竟然搜不到详细一点的帖子,估计大家用JAVA去管理进程的场景比较少吧,只好自己总结一个。Java管理进程,API级别是使用:Runtime.getRuntime().exec(“shell”); ...
  • fd_mas
  • fd_mas
  • 2015年12月02日 14:21
  • 2167

解决Backup Exec备份Windows 2008操作系统出现"带异常的成功"问题

故障描述: 在windows 2008中,Backup Eexc无论如何都会调用AFO功能备份相关数据且提示以下错误信息。 Backup jobs fails with VSS Snapshot ...

linux 下node.js 使用child_process模块的exec方法所遇问题

我们在使用child_process模块的exec方法时经常会遇到“未找到命令”错误,如下简单示例://test.js: var exec = require('child_process').exe...

Android通过Runtime.getRuntime().exec实现Ping和Traceroute命令时readLine阻塞问题解决

在Android中实现像在PC上调用cmd命令,进行一些常用的m
  • mad1989
  • mad1989
  • 2014年05月05日 18:56
  • 22045

Linux进程理解与实践(三)进程终止函数和exec函数族的使用

进程的几种终止方式(Termination) (1)正常退出    从main函数返回[return]    调用exit    调用_exit或者_Exit    最后一个线程从其启动处返...
  • NK_test
  • NK_test
  • 2015年09月09日 23:55
  • 1572
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:使用exec启动其他进程时可能出现的问题
举报原因:
原因补充:

(最多只允许输入30个字)