Vous êtes sur la page 1sur 12

SISTEMAS DE OPERACIONES

GUIA DE LABORATORIO
ECP 1 de 12

I.

II.

TEMA: CREACION DE PROCESOS

OBJETIVO DE LA PRACTICA

Al finalizar la presente prctica, el estudiante:


1. Comprende los mecanismos de gestin de procesos en Linux
2. Desarrolla aplicaciones para la gestin de procesos en Linux

III.

TRABAJO PREPARATORIO.
Para un trabajo con mejores resultados, es imprescindible que el estudiante:
1. Tenga conocimientos de programacin en C en el sistema operativo Linux
2. Conozca la teora de gestin de procesos en los sistemas operativos.

IV.

MATERIALES.
Para el desarrollo de la presente prctica 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

IDENTIFICACIN DE PROCESOS
POSIX identifica cada proceso por medio de un entero nico llamado identificador de
proceso de tipo pid_t.
A continuacin se indica las funciones para la identificacin 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 ejecucin. Estas variables se denominan variables de entorno, y
son accesibles a un proceso a travs 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);

GESTIN DE PROCESOS
La creacin de procesos se realiza utilizando el servicio fork(). El sistema operativo trata
este servicio realizando una clonacin 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 funcin 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 continuacin:
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 ejecucin de un proceso


void exit(int status);
Esta funcin es equivalente a la sentencia
return (valor);

Esperar por la finalizacin 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 ejecucin de un hijo


Suspende al proceso durante un nmero 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.

Solucin
//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 <sys/types.h>
#include <stdio.h>
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

Solucin

//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 <stdio.h>
#include <sys/types.h> //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 informacin del usuario y el grupo de usuario
que ejecuta un proceso

Solucin
//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 <sys/types.h>
#include <stdio.h>
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

Solucin

//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 <stdio.h>
#include <stdlib.h>

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

Solucin

//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 <stdio.h>
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

Solucin

//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 <stdio.h>
#include <sys/types.h>

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.

Solucin

//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 <stdio.h>
#include <sys/types.h>
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.

Solucin

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

:
:
:
:
:

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

<sys/types.h>
<stdio.h>
<unistd.h>
<sys/wait.h>

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 jerarqua de procesos como la mostrada en el grfico
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 nmero.
3. Escriba un programa que cree un hijo, espere su terminacin y muestre la informacin de
estado de terminacin del mismo.
4. Escriba un programa que cree un proceso hijo que determine la raz 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 nmero 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 Visin Aplicada, 1ra edicin. 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 edicin.
[L04]. Marquez, M. UNIX. Programacin Avanzada. 2da edicin. Editorial Alfaomega
2001.
[L05]. Perez F, et. al. Problemas De Sistemas Operativos. De La Base Al Diseo. 2da
edicin. Editorial McGraw Hill, 2003.
[L06]. Stallings, W. Sistemas Operativos. 5ta edicin. Editorial Prentice Hall 2005
[L07]. Tanenbaum, A. Sistemas Operativos. Diseo e Implementacin. 3ra edicin.
Editorial Prentice Hall 2006.
[L08]. Tanenbaum, A. Sistemas Operativos Modernos. 2da edicin. Editorial Prentice
Hall 2001.
REFERENCIAS WEB
[W01]. Carrasco E. Sitio web de la asignatura http://in.unsaac.edu.pe/ecarrasco/so.

Vous aimerez peut-être aussi