Gestion de Procesos

SISTEMAS DE OPERACIONES GUIA DE LABORATORIO ECP 1 de 12 I. II. TEMA: CREACION DE PROCESOS OBJETIVO DE LA PRACTICA A

Views 107 Downloads 2 File size 62KB

Report DMCA / Copyright

DOWNLOAD FILE

Recommend stories

Citation preview

SISTEMAS DE OPERACIONES GUIA DE LABORATORIO ECP 1 de 12

I.

II.

TEMA: CREACION DE PROCESOS

OBJETIVO DE LA PRACTICA

Al finalizar la presente práctica, el estudiante: 1. Comprende los mecanismos de gestión de procesos en Linux 2. Desarrolla aplicaciones para la gestión de procesos en Linux

III.

TRABAJO PREPARATORIO. Para un trabajo con mejores resultados, es imprescindible que el estudiante: 1. Tenga conocimientos de programación en C en el sistema operativo Linux 2. Conozca la teoría de gestión de procesos en los sistemas operativos.

IV.

MATERIALES. Para el desarrollo de la presente práctica es necesario contar con: 1. Computador con arquitectura x86. 2. Sistema operativo Linux instalado en el computador o en su defecto un liveCD o liveUSB que incluya el compilador GCC y un editor de texto pre instalado.

SISTEMAS DE OPERACIONES GUIA DE LABORATORIO ECP 2 de 12

V.

MARCO TEORICO

SERVICIOS POSIX PARA LA GESTION DE PROCESOS

IDENTIFICACIÓN DE PROCESOS POSIX identifica cada proceso por medio de un entero único llamado identificador de proceso de tipo pid_t. A continuación se indica las funciones para la identificación de procesos: Obtener el identificador de proceso pid_t getpid(void);

Obtener el identificar del proceso padre pid_t getppid(void);

EL ENTORNO DE UN PROCESO El entorno de un proceso viene definido por una lista de variables que se pasan al mismo en el momento de comenzar su ejecución. Estas variables se denominan variables de entorno, y son accesibles a un proceso a través de la variable externa environ, declarada de la siguiente manera: extern char **environ;

Obtener el valor de una variable de entorno char *getenv(const char *name);

Definir el entorno de un proceso char *setenv(char **env);

GESTIÓN DE PROCESOS La creación de procesos se realiza utilizando el servicio fork(). El sistema operativo trata este servicio realizando una clonación del proceso que lo solicite, el mismo que se convierte en el proceso padre del nuevo proceso el cual es, a su vez, el proceso hijo.

SISTEMAS DE OPERACIONES GUIA DE LABORATORIO ECP 3 de 12

El prototipo de esta función es el siguiente: pid_t fork();

Ejecutar un programa El servicio exec tiene por objeto cambiar el programa que está ejecutando un proceso. En POSIX existe una familia de funciones exec, cuyos prototipos se muestran a continuación: int int int int int int

execl(char *path, char *arg, …); execv(char *path, char *argv[]); execle(char *path, char *arg, …); execve(char *path, char *argv[], char *envp[]); execlp(char *file, const char *erg, …); execvp(char *file, char *argv[]);

la familia de funciones exec no retornan al programa que las invoca, pues al ser invocadas, sobreescriben el contexto del proceso llamante.

Terminar la ejecución de un proceso void exit(int status); Esta función es equivalente a la sentencia return (valor);

Esperar por la finalización de un proceso hijo El proceso padre se queda bloqueado hasta que termina un proceso hijo. Existen dos formas de invocar este servicio: pid_t wait(int *status); pid_t waitpid(pid_t pid, int *status, int options);

Suspender la ejecución de un hijo Suspende al proceso durante un número determinado de segundos. Su prototipo es: int sleep(unsigned int seconds);

SISTEMAS DE OPERACIONES GUIA DE LABORATORIO ECP 4 de 12

VI.

TRABAJO DE LABORATORIO.

1. Escriba un programa que permita recuperar el identificador de un proceso.

Solución //Nombre //Proposito //Autor //FCreacion //FModificacion

: : : : :

idProcesos muestra el pid de procesos padre e hijo E. Carrasco (basado en [L01] y [L04]) 11/02/2008 27/02/2013

#include #include int main() { //Variables pid_t id_proceso; pid_t id_padre; //Indicar proposito del programa puts("\n==== ESTE PROGRAMA MUESTRA EL IDENTIFICADOR DE PROCESO DE UN PROCESO Y DE SU PROCESO PADRE ====\n"); //Procesar id_proceso = getpid(); id_padre = getppid(); //Mostrar resultados printf("Identificador de proceso : %d\n", id_proceso); printf("Identificador del proceso padre : %d\n", id_padre); //Salir return 0; }

2. Escriba un programa que muestre su nombre e identificador de proceso

Solución

//Nombre //Proposito

: :

nombreMasId muestra el nombre y el identificador de un proceso

SISTEMAS DE OPERACIONES GUIA DE LABORATORIO ECP 5 de 12

//Autor : //FCreacion : //FModificacion :

Edwin carrasco 27/02/2013 ----

#include #include //tipos de datos v.g. pid_t int main (int argc, char *argv[]) { //Variables char *nombreDePrograma = argv[0];

//Lee el nombre del programa de la linea de comandos

pid_t processId; //Indicar proposito del programa puts("\n==== ESTE PROGRAMA MUESTRA SU NOMBRE Y SU IDENTIFICADOR DE PROCESO ====\n"); //Procesar processId = getpid(); //Mostrar resultados //Sumamos 2 para omitir los caracteres "./" printf("Mi nombre de programa es: %14s\n", nombreDePrograma+2); printf("Mi identificador de proceso es: %6d\n\n", processId); //salir return 0; }

3. Escriba un programa que permita mostrar información del usuario y el grupo de usuario que ejecuta un proceso

Solución //Nombre //Proposito

: :

//Autor : //FCreacion : //FModificacion :

infoProc muestra informacion del usuario y el grupo de usuario que ejecuta un proceso E. Carrasco (basado en [L01] y [L04]) 11/02/2008 27/02/2013

#include #include int main() { //Indicar proposito del programa

SISTEMAS DE OPERACIONES GUIA DE LABORATORIO ECP 6 de 12

puts("\n==== ESTE PROGRAMA MUESTRA INFORMACION DEL USUARIO QUE EJECUTA EL PROCESO ====\n"); //Mostrar resultados printf("Identificador printf("Identificador printf("Identificador printf("Identificador

de usuario : %d\n", getuid()); de usuario efectivo : %d\n", geteuid()); del grupo : %d\n", getgid()); de grupo efectivo : %d\n", geteuid());

//Salir return 0; }

4. Escriba un programa que muestre la variable de entorno HOME de un proceso

Solución

//Nombre //Proposito

: :

//Autor : //FCreacion : //FModificacion :

printHome imprime el contenido de la variable de entorno HOME E. Carrasco (basado en [L01] y [L04]) 11/02/2008 28/02/2013

#include #include

int main() { //Variables char *home = NULL; //Indicar proposito del programa puts("\n==== ESTE PROGRAMA MUESTRA EL CONTENIDO DE LA VARIABLE HOME DEL SISTEMA ====\n"); //Procesar y mostrar home = getenv("HOME"); if (home == NULL) printf("HOME no se encuentra definida\n"); else printf("El valor de HOME es %s\n", home); //Salir return 0; }

SISTEMAS DE OPERACIONES GUIA DE LABORATORIO ECP 7 de 12

5. Escriba un programa que muestre todas las variables de entorno de un proceso

Solución

//Nombre //Proposito //Autor //FCreacion //FModificacion

: : : : :

entornoProc imprime informacion del entorno de un proceso E. Carrasco (basado en [L01] y [L04]) 11/02/2008 28/02/2013

#include extern char **environ; //Variable externa int main() { //Variables char** var; //Indicar proposito del programa puts("\n==== ESTE PROGRAMA MUESTRA INFORMACION DEL ENTORNO DE UN PROCESO ====\n"); //Procesar y mostrar resultados for(var = environ; *var != NULL; ++var) printf("%s\n", *var); //Salir return 0; }

6. Escriba un programa que cree un proceso hijo. Cada proceso debe mostrar su identificador

Solución

//Nombre //Proposito //Autor //FCreacion //FModificacion

: : : : :

creaProcesoHijo crea un proceso hijo y muestra su ID E. Carrasco (basado en [L01] y [L04]) 11/02/2008 28/02/2013

#include #include

SISTEMAS DE OPERACIONES GUIA DE LABORATORIO ECP 8 de 12

extern char **environ; //Variable externa int main() { //Variables pid_t forkReturn; //Indicar proposito dle programa puts("\n==== ESTE PROGRAMA CREA UN PROCESO Y MUESTRA EL ID DEL PROCESO CREADO Y DEL PROCESO CREADOR ====\n"); //Procesar forkReturn = fork(); //Creamos el proceso //Mostrar resultados if (forkReturn == 0) //¿Quien soy? { //Este codigo se ejecuta solo en el proceso hijo printf("Soy el proceso Hijo. Mi PID es %d\n", getpid()); } else { //Este codigo se ejecuta solo en el proceso padre printf("Soy el proceso Padre. Mi PID es %d\n",getpid()); } //Salir return 0; }

7. Escriba un programa que cree N procesos hijo.

Solución

//Nombre //Proposito //Autor //FCreacion //FModificacion

: : : : :

creaNHijos crea N hijos para un proceso E. Carrasco (basado en [L01] y [L04]) 11/02/2008 28/02/2013

#include #include int main() { //Variables pid_t forkReturn; int i; int n=5;

SISTEMAS DE OPERACIONES GUIA DE LABORATORIO ECP 9 de 12

//Indicar proposito del programa puts("\n==== ESTE PROGRAMA CREA N PROCESOS HIJO Y CADA UNO MUESTRA SU IDENTIFICADOR Y EL DE SU PADRE ====\n"); //Procesar for (i = 0; i < n; i++) { forkReturn = fork(); if (forkReturn == 0) break; //Si es el hijo, salir del bucle } //Mostrar resultados printf("%d; El padre del proceso %d es %d \n", i, getpid(), getppid()); //Salir return 0; }

8. Escriba un programa que cree un proceso hijo, el cual debe invocar el comando ls para listar el contenido de la carpeta actual.

Solución

//Nombre //Proposito //Autor //FCreacion //FModific. #include #include #include #include

: : : : :

listar lista el contenido de la carpeta actual Edwin Carrasco 29/06/2013 ---



int main() { //Variables pid_t valFork; //Procesar valFork = fork(); switch (valFork) {

SISTEMAS DE OPERACIONES GUIA DE LABORATORIO ECP 10 de 12

case -1: //Error al crear hijo fprintf(stderr, "Error al crear archivo\n"); break; case 0: //Proceso hijo printf("\nProceso hijo con valFork = %d e id de proceso %d\n", valFork, getpid()); printf("\nListado de la carpeta actual\n\n"); execlp("/bin/ls", "ls", NULL); break; default: //Proceso padre wait(NULL); printf("\nProceso padre con id de proceso %d, informa que\n", getpid()); printf("\nel proceso hijo (%d) ha terminado!!\n", valFork); break; } //Salir return 0; }

SISTEMAS DE OPERACIONES GUIA DE LABORATORIO ECP 11 de 12

VII.

PRACTICAS DE LABORATORIO 1. Escriba un programa que cree una jerarquía de procesos como la mostrada en el gráfico adjunto

2. Escriba un programa que cree un proceso hijo que calcule el cuadrado de un numero ingresado por el usuario. El proceso padre debe calcular el cubo de dicho número. 3. Escriba un programa que cree un hijo, espere su terminación y muestre la información de estado de terminación del mismo. 4. Escriba un programa que cree un proceso hijo que determine la raíz cuadrada de un numero ingresado por el usuario. El proceso padre debe mostrar el resultado calculado (investigue la llamada vfork()). 5. Escriba un programa que cree un proceso hijo el cual genere un número entero aleatorio, cuya primalidad sea verificada por el padre.

SISTEMAS DE OPERACIONES GUIA DE LABORATORIO ECP 12 de 12

VIII.

BIBLIOGRAFIA

LIBROS [L01]. Carretero J, et. al “Sistemas Operativos. Una Visión Aplicada”, 1ra edición. Editorial McGraw Hill 2001 [L02]. Deitel, H “Operating Systems”. Editorial Addison Wesley 1990. [L03]. Deitel & Deitel, “Como Programar En C/C++”. Editorial Prentice Hall 2da edición. [L04]. Marquez, M. “UNIX. Programación Avanzada”. 2da edición. Editorial Alfaomega 2001. [L05]. Perez F, et. al. “Problemas De Sistemas Operativos. De La Base Al Diseño”. 2da edición. Editorial McGraw Hill, 2003. [L06]. Stallings, W. “Sistemas Operativos”. 5ta edición. Editorial Prentice Hall 2005 [L07]. Tanenbaum, A. “Sistemas Operativos. Diseño e Implementación”. 3ra edición. Editorial Prentice Hall 2006. [L08]. Tanenbaum, A. “Sistemas Operativos Modernos”. 2da edición. Editorial Prentice Hall 2001. REFERENCIAS WEB [W01]. Carrasco E. Sitio web de la asignatura http://in.unsaac.edu.pe/ecarrasco/so.