使用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下C语言开发(进程控制编程——fork()、exec函数族)

在Linux中创建一个新进程的唯一方法是使用fork()函数。fork()函数是Linux中一个非常重要的函数,和以往遇到的函数有一些区别,因为fork()函数看起来执行一次却返回两个值。...
  • Thanksgining
  • Thanksgining
  • 2014年12月15日 15:00
  • 4012

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

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

shell 命令的执行—fork & exec

shell命令分为 内建命令 & 外部命令 内建命令(builtin command) 是shell解释程序内建的,由shell直接执行,不需要派生新的进程。    常见的内建命令: .(...
  • Cooling88
  • Cooling88
  • 2016年08月24日 17:32
  • 3265

启动进程:exec函数族

(一) 说是exec系统调用,实际上在Linux中,并不存在一个exec()的函数形式,exec指的是一组函数,一共有6个,分别是:        (1)int execl(const ...
  • guanyasu
  • guanyasu
  • 2016年10月17日 22:50
  • 130

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

http://blog.csdn.net/chrisniu1984/article/details/7050663 我们经常会碰到需要fork子进程的情况,而且子进程很可能会继续ex...
  • zxygww
  • zxygww
  • 2016年10月24日 13:11
  • 423

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

通过fcntl设置FD_CLOEXEC标志有什么用?    close on exec, not on-fork, 意为如果对描述符设置了FD_CLOEXEC,使用execl执行的程序里,此描述...
  • hunanchenxingyu
  • hunanchenxingyu
  • 2014年05月07日 01:08
  • 3487

Linux下多进程编程之exec函数语法及使用实例

exec函数族     1)exec函数族说明     fork()函数用于创建一个子进程,该子进程几乎复制了父进程的全部内容,但是,这个新创建的进程如何执行呢?exec函数族就提供了一个在进程中...
  • u010781856
  • u010781856
  • 2015年03月02日 09:36
  • 209

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

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

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

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

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

作者:zieckey (http://zieckey.cublog.cn)     All Rights Reserved! exec用被执行的程序完全替换调用它的程序的影像。fork创建一个...
  • diy534
  • diy534
  • 2011年11月13日 04:09
  • 271
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:使用exec启动其他进程时可能出现的问题
举报原因:
原因补充:

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