/* * @(#)Process.java 1.23 03/12/19 * * Copyright 2004 Sun Microsystems, Inc. All rights reserved. * SUN PROPRIETARY/CONFIDENTIAL. Use is subject to license terms. */ package java.lang; import java.io.*; /** * The {@link ProcessBuilder#start()} and * {@link Runtime#exec(String[],String[],File) Runtime.exec} * methods create a native process and * return an instance of a subclass of Process that can * be used to control the process and obtain information about it. * The class Process provides methods for performing * input from the process, performing output to the process, waiting * for the process to complete, checking the exit status of the process, * and destroying (killing) the process. * *

* The methods that create processes may not work well for special * processes on certain native platforms, such as native windowing * processes, daemon processes, Win16/DOS processes on Microsoft Windows, or shell * scripts. The created subprocess does not have its own terminal or * console. All its standard io (i.e. stdin, stdout, stderr) operations * will be redirected to the parent process through three streams * ({@link #getOutputStream()}, * {@link #getInputStream()}, * {@link #getErrorStream()}). * The parent process uses these streams to feed input to and get output * from the subprocess. Because some native platforms only provide * limited buffer size for standard input and output streams, failure * to promptly write the input stream or read the output stream of * the subprocess may cause the subprocess to block, and even deadlock. * *

* The subprocess is not killed when there are no more references to * the Process object, but rather the subprocess * continues executing asynchronously. * *

* There is no requirement that a process represented by a Process * object execute asynchronously or concurrently with respect to the Java * process that owns the Process object. * * @author unascribed * @version 1.23, 12/19/03 * @see ProcessBuilder * @see Runtime#exec(String[], String[], File) * @since JDK1.0 */ public abstract class Process { /** * Gets the output stream of the subprocess. * Output to the stream is piped into the standard input stream of * the process represented by this Process object. *

* Implementation note: It is a good idea for the output stream to * be buffered. * * @return the output stream connected to the normal input of the * subprocess. */ abstract public OutputStream getOutputStream(); /** * Gets the input stream of the subprocess. * The stream obtains data piped from the standard output stream * of the process represented by this Process object. *

* Implementation note: It is a good idea for the input stream to * be buffered. * * @return the input stream connected to the normal output of the * subprocess. * @see ProcessBuilder#redirectErrorStream() */ abstract public InputStream getInputStream(); /** * Gets the error stream of the subprocess. * The stream obtains data piped from the error output stream of the * process represented by this Process object. *

* Implementation note: It is a good idea for the input stream to be * buffered. * * @return the input stream connected to the error stream of the * subprocess. * @see ProcessBuilder#redirectErrorStream() */ abstract public InputStream getErrorStream(); /** * causes the current thread to wait, if necessary, until the * process represented by this Process object has * terminated. This method returns * immediately if the subprocess has already terminated. If the * subprocess has not yet terminated, the calling thread will be * blocked until the subprocess exits. * * @return the exit value of the process. By convention, * 0 indicates normal termination. * @exception InterruptedException if the current thread is * {@link Thread#interrupt() interrupted} by another thread * while it is waiting, then the wait is ended and an * {@link InterruptedException} is thrown. */ abstract public int waitFor() throws InterruptedException; /** * Returns the exit value for the subprocess. * * @return the exit value of the subprocess represented by this * Process object. by convention, the value * 0 indicates normal termination. * @exception IllegalThreadStateException if the subprocess represented * by this Process object has not yet terminated. */ abstract public int exitValue(); /** * Kills the subprocess. The subprocess represented by this * Process object is forcibly terminated. */ abstract public void destroy(); }