Ejecución de procesos nativos y su comunicación con Java

Al estudiar los mecanismos para crear procesos y su comunicación entre procesos en Unix (Linux) estudiamos fork y pipes entre otros. Java también dispone de mecanismos para correr otros procesos (externos a la máquina virtual Java) y relacionarse con ellos.

La clase RunTime dispone del método exec, el cual permite ejecutar un programa cualquiera disponible en la máquina (proceso nativo) y retorna una instancia de una subclase de la clase Process. Ésta puede ser usada para controlar el proceso y obtener información sobre éste.

Analogías: (fork() + exec()) en Lunix     <->   (Runtime.getRuntime() + "runtime".exec()) en Java = "proceso para programa externo"

La clase Process provee métodos para hacer lecturas desde el proceso (salida estándar de éste), escrituras hacia el proceso (entrada estándar del proceso), esperar por el término del proceso, y destruir (kill) el proceso.

Analogía: (pipe() + dup2()+close() en linux)   <-> (Process.getOutputStream() | Process.getInputStream() | Process.getErrorStream() en Java.

Para más detalles ver página descriptiva de la clase RunTime, y la documentación de la clase Process.  Espero que usted note que gracias al estudio hecho antes sobre el manejo de procesos en Unix, la comprensión de estas clases se facilita.

Todas las operaciones de IO (stdin, stdout, stderr) del proceso creado con método exec son redirigidas al proceso padre a través de tres flujos (Process.getOutputStream(), Process.getInputStream(), Process.getErrorStream()).

JavaPing es un ejemplo donde invocamos al comando ping desde Java. La salida estándar del ping es mostrada en pantalla por Java. Análogamente podemos hacer uso de cualquier programa o servicio disponible en la máquina vía IO estándar.