Anda di halaman 1dari 7

Universidad de Puerto Rico Recinto Universitario de Mayag ez u Departmento de Ingenier Elctrica y de Computadoras a e ICOM 5007 Programacin de Sistemas Operativos o

Profesor: Emmanuel Arzuaga, Telfono: 787-832-4040 x5952, Email: earzuaga@ece.uprm.edu e Instructores: Juan Valera, Email: juan.valera@upr.edu (seccin 086) o Manuel Orn, Email: manuel.oran@upr.edu (seccin 100) a o

Laboratorio 1: Procesos, Se ales e Interfaces de Usuario n


El propsito de este laboratorio es repasar los conceptos de procesos y comunicacin entre procesos o o discutidos en clase.

Actividades previo al laboratorio:

Cree un directorio llamado icom5007 y dentro de ste otro llamado lab1. Obtenga el Archivo del e laboratorio y descomprimalo dentro de lab1: terminal~> mkdir -p icom5007/lab1 terminal~> cd icom5007/lab1 terminal~> tar -xvzf path/icom5007-lab1.tar.gz

1.1

Manejo de Se ales n

Pratique con una sesin del terminal ($SHELL Command Line) la lista de comandos o o bsicos de UNIX/LINUX prove a dos en el laboratorio (unixref.pdf). Puede utilizar la documentacin en l o nea de la librer glibc para aprender ms a fondo de las seales disponibles en a a n LINUX (http://www.gnu.org/software/libc/manual/html mono/libc.html#Signal-Handling). Localice el archivo signalSample.c y comp lelo utilizando gcc: Identique que seal est manejando el programa. n a Modique el programa de tal forma que tambin maneje la seal SIGTERM. e n Verique que el programa maneje adecuadamente la seal. n Modique el programa para que maneje adecuadamente AMBAS seales. n

Meta Alcanzada!; Documente sus resultados y muestre al instructor la salida del programa y modicaciones al cdigo. o 1

1.2

Procesos

Localice el archivo processSample.c y comp lelo utilizando gcc: Identique que es haciendo el cdigo y sus partes. Identique el proceso padre parent-process a o y el recin creado child-process. e Modique la ejecucin del programa de tal forma que el proceso principal espere a que el o recin creado termine antes de ste terminar. e e

Meta Alcanzada!; Documente sus resultados y muestre al instructor la salida del programa y modicaciones al cdigo. o

2
2.1

Actividades del Laboratorio


Crear una interfaz Command Line para los usuarios

El propsito de esta seccin es crear una interfaz de usuario tipo terminal usando C/C++. Para o o trabajar en esta parte del proyecto, debe asegurarse de tener los siguientes componentes: CMake (http://www.cmake.org). boost C++ library (http://boost.org). 2.1.1 Crear un proyecto que utilice CMake

El primer paso es crear nuestra estructura de directorios para manejar nuestro proyecto. Para esto utilizaremos el directorio base icom5007 seguido por lab1 creados anteriormente. Dentro de lab1 colocaremos un directorio myterm y dentro del mismo otros dos directorios uno para guardar el ejecutable (/bin) y otro para guardar el cdigo (/src). Comenzaremos en el directorio /src: o terminal~> mkdir -p myterm/bin terminal~> mkdir myterm/src terminal~> cd myterm/src Crear un archivo de nombre CMakeLists.txt que contenga lo siguiente: cmake_minimum_required(VERSION 2.8) project(lab1) set(lab1_sources shell.cxx command.h command.cxx ) include_directories(boost include path) add_executable(lab1 \${lab1_sources}) 2

El boost include path es la localidad donde se instal la librer boost, en Ubuntu es muy probable o a que est dentro de: /usr/include/boost. Luego de crear CMakeLists.txt, proceda a crear un e archivo llamado shell.cxx que contendr la funcin main() de nuestro proyecto: a o #include <iostream> int main() { std::cout << "Hello User!" << std::endl; return 0; } Ya estamos listos para probar la compilacin de nuestro proyecto usando cmake, para sto nos o e movemos al directorio bin de nuestro proyecto y compilamos: terminal~> cd ../bin terminal~> cmake ../src terminal~> make La secuencia de comandos anterior debi producir un archivo de nombre lab1 dentro de /bin, o verique que en efecto el archivo existe y ejecute el archivo: terminal~> ./lab1 terminal~> Hello User!

Meta Alcanzada!, muestre al instructor la salida de su programa.


2.1.2 Crear la interfaz de Command Line Recordemos que nuestro archivo shell.cxx se encarga del main() de nuestro proyecto, por lo tanto siguiendo un diseo modular debemos crear archivos adicionales que provean la funcionalidad que n estamos necesitando. Para ello, crearemos una clase llamada command que se encargar de proveer a la interfaz de comandos al usuario. El primer paso es modicar nuestro archivo shell.cxx para que utilice command: #include <iostream> #include "command.h" int main(){ command cmd; do{ if (!cmd.readline()) { cmd.print_usage(); } else{ 3

// Our command class // Read command from user // Show usage

cmd.execute(); } } while (!cmd.exit_requested()); return 0; }

// Execute command // Check for termination

De la funcin main() podemos identicar 4 mtodos bsicos que la clase command debe implemeno e a tar: bool readline() - Devuelve true si el comando es vlido y puede ser ejecutado; false de a lo contrario. void print usage() - Muestra un mensaje al usuario acerca de como utilizar la interfaz. void execute() - Ejecuta el comando entrado por el usuario, si es salir ("exit") noticar a la interfaz. o const bool exit requested() - Devuelve true si se llam un comando para salir de la interfaz; false de lo contrario. La declaracin de la clase command en el archivo command.h debe al menos contener lo siguiente: o #ifndef COMMAND_H #define COMMAND_H #include <string> class command { public: command(); const bool exit_requested() const { return this->exit_requested_; } bool readline(); void print_usage() const; void execute(); private: bool exit_requested_; }; #endif // COMMAND_H La implementacin a su vez en el archivo command.cxx contendr o a: #include "command.h" #include <iostream> command::command() 4

: exit_requested_(false) { } bool command::readline() { // TODO: Print prompt for the user. // Read line from user. } void command::print_usage() const { // TODO: Display usage format to user. } void command::execute() { // TODO: Execute the command. } Implemente los mtodos readline() y print usage() y recompile su proyecto: e terminal~> cd ../bin terminal~> make terminal~> ./lab1

Meta Alcanzada!; Ejecute el proyecto y muestre al instructor la salida de su programa.


2.1.3 Procesar el Comando Luego de leer el comando entrado por el usuario, el mtodo readline() debe validar que dicho e comando es vlido. Si es vlido, luego lo podemos procesar para que el mtodo execute() se a a e encargue de la ejecucin. Para validar el comando, vamos a hacer uso del grupo de funciones o disponibles para manejar regular expressions (regex) como parte de la libreria boost para cdigo o en C/C++ dentro de command.cxx: #include <boost/xpressive/xpressive.hpp> Ahora podemos aadir un mtodo privado bool is valid command line(const std::string& n e line) const que devuelve true si el comando es una regex vlida y false de lo contrario: a bool command::is_valid_command_line(const std::string& line) const { // TODO: Compare line to valid command structure using regex // Hint: check boost::expressive::sregex } 5

Una vez hemos validado que el comando tiene una estructura vlida, podemos procesar la l a nda y extraer el comando y los par metros (si alguno) para colocarlos de una forma que execute los a pueda utilizar. Para esto crearemos un mtodo privado parse line(const std::string& line) e que nos extraiga el comando y lo coloque en un std::vector global llamado parameters : bool command::parse_line(const std::string& line) const { // TODO: Parse command // Hint: check boost::expressive::sregex // boost::expressive::sregex_iterator } Note que hace falta que tambin incluya la declaracin de ambos mtodos en command.h. Lo ms e o e a a seguro es que parse line haga uso interno de is valid command line. A su vez, readline har uso interno de parse line. Implemente stas funciones y compile nuevamente su proyecto. terminal~> cd ../bin terminal~> make terminal~> ./lab1

Meta Alcanzada!; Ejecute el proyecto y muestre al instructor la salida de su programa.


2.1.4 Ejecucin de los Commandos o e Una vez tengamos el std::vector parameters con nuestro comando a ejecutar, el mtodo execute() est a cargo de que esto ocurra. Modique execute() para que utilice el contenido de parameters . a Por ejemplo, si nos interesa identicar si el comando es exit para noticar la interfaz: void command::execute() { std::string cmd = this->parameters_[0]; if (cmd == "exit") { this->exit_requested_ = true; } else { // TODO: Execute the command. // Hint: check execvp } } Implemente el mtodo execute() y recompile el proyecto. e Meta Alcanzada!; Ejecute el proyecto actualizado y muestre al instructor la salida de su programa. 6

2.1.5

Tareas Avanzadas

La interfaz Command Line que estamos desarrollando debe manejar una serie de comandos nativamente (sin el uso de execvp). Estas incluyen: help - Muestra un mensaje al usuario acerca de como utilizar la interfaz. exit - Salir de la interfaz. history - Cuando se utiliza sin parmetros muestra una lista de todos los comandos ejecutados a por la interfaz hasta el momento. La salida es de la siguiente forma: terminal~> history 0 date 1 ls 2 history Cuando se utiliza con parmetros (nmeros desde 0 a cantidad de comandos ejecutados hasta a u el momento), el comando ejecutado en el orden del nmero seleccionado se volver a ejecutar. u a Tomando como ejemplo la salida mostrada, history 1 ejecutar nuevamente el comando ls. a cd (opcional) - Ejecuta el comando cd de cualquire terminal de linux. Este comando es implementado nativo tambin por la interfaz nativa, as que si queremos que la nuestra funcione e adecuadamente lo debemos implementar nativamente tambin. Implemente las tareas avanzadas y entregue el directorio del proyecto al instructor para evualuacin. o El mismo debe ser comprimido usando tar de la siguiente forma: terminal~> cd icom5007/lab1 terminal~> tar -cfvz secno-lastnameInitial-lab1.tar.gz * secno es la seccin del curso, lastname es el primer apellido e Initial es la inicial del primer o nombre. La fecha de entrega sugerida para este trabajo es:

Seccin 086: 09/05/12 a las 11:59PM o Seccin 100: 09/03/12 a las 11:59PM o
Queda a discrecin del instructor de laboratorio dependiendo del progreso realizado extender dicha o fecha.

Anda mungkin juga menyukai