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
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
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!
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
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
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.