Skip to content

2 Runtime

Introducción

Como sabemos, desde el punto de vista de los sistemas operativos, llamamos programa a la representación en disco de una aplicación, que contiene tanto el código como los datos que maneja.

Por otra parte, podríamos definir proceso como la representación en el sistema de un programa en ejecución. Cuando se inicia la ejecución de un programa, por ejemplo por indicación del usuario, el sistema operativo crea un proceso que representa la ejecución de dicho programa en dicho sistema operativo.

El proceso recibe un identificador único conocido como PID (process identification), y contiene no sólo el código a ejecutar y los datos que gestiona, sino también toda la información necesaria para que el sistema operativo pueda ejecutar el programa, como vimos en el apartado anterior.

Cuando un proceso finaliza su ejecución puede indicar lo que se conoce como valor de terminación (exit value), con el que el proceso puede indicar al sistema operativo si su ejecución concluyó con normalidad, representado normalmente por un exit value de 0, o si se produjo algún tipo de error.

Toda aplicación Java en ejecución posee una instancia de la clase Runtime, que representa al entorno en el que se está ejecutando, que puede ser obtenida mediante su método estático Runtime.getRuntime(). El método exit(exitValue) del objeto Runtime permite terminar explícitamente la ejecución del proceso indicando un exit value. Por convención, un exit value distinto de cero es indicativo de que se ha producido terminación anormal, sintomática de algún error. Si un proceso nunca llama a este método, su ejecución terminará con un exit value de cero.

Note

Existe un método estático System.exit(exitValue), que es que se utiliza tradicionalmente para indicar un exit value distinto de cero, que internamente simplemente llama a Runtime.getRuntime().exit(exitValue).

Creación de subprocesos con Runtime

Un proceso puede comenzar la ejecución de otro proceso, al que denominaremos subproceso o proceso hijo, y ambos procesos, padre e hijo, podrán comunicarse.

Podemos utilizar el objeto Runtime para iniciar, desde nuestra aplicación, la ejecución de otro programa, para lo que utilizaremos su método exec(), que recibe, en su forma más simple, el nombre del fichero ejecutable del programa u orden del sistema operativo que queremos que se ejecute, y que retorna un objeto de la clase Process, que representa el subproceso recién iniciado. Si se produce algún error de entrada /salida se genera la excepción IOException, y si el gestor de seguridad no nos permite ejecutar la orden se lanzará la excepción SecurityException.

Para ejecutar en Windows una orden (comando) de MS-DOS utilizaremos el intérprete de comandos CMD con la sintaxis CMD /C comando si queremos el intérprete de cierre tras ejecutar la orden o CMD /K comando si queremos que permanezca en ejecución. En el caso de Linux/Mac podemos usar directamente el comando deseado o mediante el intérprete de comandos /bin/sh -c comando.

Runtime runtime = Runtime.getRuntime();
String command = "CMD /C DIR";
Process process = runtime.exec(command);

El método exec() está sobrecargado, pudiendo recibir otros parámetros:

  • Orden y argumentos (cmdarray): Array de cadenas correspondientes al nombre del fichero ejecutable u orden que debe ser invocado y sus argumentos. Debe ser válida para el sistema operativo en el que se ejecute el programa.
  • Entorno (environment): variables de entorno con el que debe ejecutarse el programa, normalmente las mismas que las del programa llamador.
  • Directorio de trabajo (dir): El directorio desde el que se debe ejecutar el programa. Por defecto el mismo que el del programa llamador.

Por ejemplo, con exec("CMD /C DIR", null, new File("C:/WINDOWS")) estamos indicando que se liste el directorio de trabajo, especificando que éste sea C:\WINDOWS.