/*
* @(#)Process.java 1.26 06/10/10
*
* Copyright 1990-2008 Sun Microsystems, Inc. All Rights Reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License version
* 2 only, as published by the Free Software Foundation.
*
* This program is distributed in the hope that it will be useful, but
* WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* General Public License version 2 for more details (a copy is
* included at /legal/license.txt).
*
* You should have received a copy of the GNU General Public License
* version 2 along with this work; if not, write to the Free Software
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
* 02110-1301 USA
*
* Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa
* Clara, CA 95054 or visit www.sun.com if you need additional
* information or have any questions.
*
*/
package java.lang;
import java.io.*;
/**
* The <code>Runtime.exec</code> methods create a native process and
* return an instance of a subclass of <code>Process</code> that can
* be used to control the process and obtain information about it.
* The class <code>Process</code> 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.
* <p>
* The <code>Runtime.exec</code> methods 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
* (<code>Process.getOutputStream()</code>,
* <code>Process.getInputStream()</code>,
* <code>Process.getErrorStream()</code>).
* 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.
* <p>
* The subprocess is not killed when there are no more references to
* the <code>Process</code> object, but rather the subprocess
* continues executing asynchronously.
* <p>
* There is no requirement that a process represented by a <code>Process</code>
* object execute asynchronously or concurrently with respect to the Java
* process that owns the <code>Process</code> object.
*
* @author unascribed
* @version 1.17, 02/02/00
* @see java.lang.Runtime#exec(java.lang.String)
* @see java.lang.Runtime#exec(java.lang.String, java.lang.String[])
* @see java.lang.Runtime#exec(java.lang.String[])
* @see java.lang.Runtime#exec(java.lang.String[], java.lang.String[])
* @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 <code>Process</code> object.
* <p>
* 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 <code>Process</code> object.
* <p>
* 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.
*/
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 <code>Process</code> object.
* <p>
* 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.
*/
abstract public InputStream getErrorStream();
/**
* causes the current thread to wait, if necessary, until the
* process represented by this <code>Process</code> 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,
* <code>0</code> 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
* <code>InterruptedException</code> 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
* <code>Process</code> object. by convention, the value
* <code>0</code> indicates normal termination.
* @exception IllegalThreadStateException if the subprocess represented
* by this <code>Process</code> object has not yet terminated.
*/
abstract public int exitValue();
/**
* Kills the subprocess. The subprocess represented by this
* <code>Process</code> object is forcibly terminated.
*/
abstract public void destroy();
}