ICOM 5007- SISTEMAS OPERATIVOS

 

Instructor: Héctor M Lugo Cordero

e-mail: hector.lugo@ece.uprm.edu

 

Laboratorio 5 – Comunicación entre procesos

I Objetivos

 

II Teoría

 

Anteriormente estudiaron como comunicar aplicaciones con procesos livianos (threads). En esta práctica aprenderán como hacer lo mismo pero con procesos pesados. Recuerden que los procesos no comparten área de memoria.

 

Si vamos hacia atrás al comienzo del laboratorio vimos que la llamada a la función exec retornaba un objeto tipo Process. Este objeto contenía varios métodos de los cuales sólo utilizamos waitFor para esperar a que el proceso terminara y exitValue para ver el valor de retorno del proceso. En esta ocasión verán como mantener una comunicación con un proceso sin necesidad de tener que esperar a que este termine para hacerlo.

 

Podemos leer de un proceso invocando el método getInputStream de la clase Process. Este InputStream puede pasarse como argumento a objetos de lectura como lo es el Scanner. Por otro lado si lo que se desea es escribirle al proceso entonces invocamos el método getOutputStream de la clase Process. De igual manera este OutputStream puede ser pasado como argumento a objetos de escritura como lo es PrintStream. A continuación aparece un ejemplo de cómo se puede leer y/o escribir a un proceso.

 

Process ps = Runtime.getRuntime().exec(“myScript”);

Scanner is = new Scanner(ps.getInputStream());

PrintStream os = new PrintStream(ps.getOutputStream());

while(is.hasNextLine()){

            String line = is.nextLine();

            if(isPrompt(line)){

                        os.print(data);

            }

            else{

                        storeResponse(line);

            }

}

 

Estas respuestas del proceso pueden ser filtradas de acuerdo a la aplicación si es necesario. Para filtrar los Strings que devuelve el proceso se puede utilizar las clases contenidas en el paquete java.util.regex.*. Las clases contenidas en dicho paquete son:

 

Clase

Descripción

Pattern

Compila las expresiones regulares a ser aplicadas a un Matcher

Matcher

Ejecuta las expresiones regulares sobre Strings y provee métodos para obtener el resultado

 

Una expresión regular es una regla en cual se trata de describir la formación de un String para cotejar más adelante si es cierto o no.

 

Ejemplo digamos que queremos verificar que el código de área de un país que ha sido entrado por un usuario este correcto. Asumimos que los valores de dicho código pueden tener como primer digito {2, 3, 4, 5, 6, 7, 8, 9} seguido por dos dígitos en el conjunto de {0, 1, 2, 3, 4, 5, 6, 7, 8, 9}. Una manera de validar esto seria cotejando que los dígitos estén en el rango especificado utilizando el método charAt del objeto String. La otra manera, más elegante y más precisa, es crear una expresión regular para probar el código de área.

 

String code = in.next();

boolean valid = Pattern.matches(“^[2-9][0-9][0-9]”, code);

 

or

 

String code = in.next();

Pattern search = Pattern.compile(“^[2-9][0-9][0-9]”);

Matcher m = search.matcher(code);

boolean valid = m.matches();

 

Para información más detallada de estos objetos vaya al API aunque es posible que

http://java.sun.com/javase/6/docs/api/java/util/regex/Pattern.html

http://java.sun.com/javase/6/docs/api/java/util/regex/Matcher.html

 

III Práctica

 

Van a escribir una aplicación en JAVA que cree un proceso el cual ejecutará `ls –al`. Dicho comando le desplegará un listado de los archivos que se encuentran en el directorio actual. Van a filtrar el nombre de los archivos, desplegando la lista completa y luego sólo los archivos que pertenecen al usuario actual con permisos especificados por el usuario a través del teclado.