Вы находитесь на странице: 1из 6

UNIVERSIDAD NACIONAL DE SAN ANTONIO ABAD DEL CUSCO

SISTEMAS DE OPERACIONES I
GUIA DE LABORATORIO
ecp 1 de 6

TEMA: CREACION DE PROCESOS

1) OBJETIVO DE LA PRACTICA
a) Capacitar al alumno en el funcionamiento y creacin de procesos en Linux.

2) TRABAJO PREPARATORIO.
a) Comprender el concepto de procesos.
b) Conocer el proceso de programacin en C para Linux.

3) 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. Los servicios de identificacin de procesos son:

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);


UNIVERSIDAD NACIONAL DE SAN ANTONIO ABAD DEL CUSCO
SISTEMAS DE OPERACIONES I
GUIA DE LABORATORIO
ecp 2 de 6

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.
El prototipo de esta funcin es el siguiente:

pid_t fork();

Ejecutar un programa

El servicio exec tiene por objeto cambiar el programa que esta ejecutando un proceso. En
POSIX existe una familia de funciones exec, cuyos prototipos se muestran a continuacin:

int execl(char *path, char *arg, );


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

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);


UNIVERSIDAD NACIONAL DE SAN ANTONIO ABAD DEL CUSCO
SISTEMAS DE OPERACIONES I
GUIA DE LABORATORIO
ecp 3 de 6

4) TRABAJO DE LABORATORIO.

a) Escriba un programa que permita recuperar el identificador de un proceso.

Solucin
/*
Nombre : idProcesos
Objetivo : muestra el pid de procesos padre e hijo
Autor :
FCreacion :
FModificacion :
*/

#include <sys/types.h>
#include <stdio.h>

main()
{
pid_t id_proceso;
pid_t id_padre;

id_proceso = getpid();
id_padre = getppid();

printf("Identificador de proceso : %d\n", id_proceso);


printf("Identificador del proceso padre : %d\n", id_padre);
}

b) Escriba un programa que permita recuperar informacin de identificacin de un proceso

Solucin

/*
Nombre : infoProc
Objetivo : muestra informacion de identificacin de un
proceso
Autor :
FCreacion :
FModificacion :
*/

#include <sys/types.h>
#include <stdio.h>

main()
{
printf("Identificador de usuario : %d\n", getuid());
printf("Identificador de usuario efectivo : %d\n", geteuid());
printf("Identificador del grupo : %d\n", getgid());
printf("Identificador de grupo efectivo : %d\n", geteuid());
}
UNIVERSIDAD NACIONAL DE SAN ANTONIO ABAD DEL CUSCO
SISTEMAS DE OPERACIONES I
GUIA DE LABORATORIO
ecp 4 de 6

c) Escriba un programa que muestre la variable de entorno HOME de un proceso

Solucin

/*
Nombre : printHome
Objetivo : imprime el valor de la variable de entorno HOME
Autor :
FCreacion :
FModificacion :
*/

#include <stdio.h>
#include <stdlib.h>

main()
{
char *home = NULL;
home = getenv("HOME");
if (home == NULL)
printf("HOME no se encuentra definida\n");
else
printf("El valor de HOME es %s\n", home);
}

d) Escriba un programa que muestre todas las variables de entorno de un proceso

Solucin

/*
Nombre : entornoProc
Objetivo : imprime informacion del entorno de un proceso
Autor :
FCreacion :
FModificacion :
*/

#include <stdio.h>

extern char **environ;

int main()
{
char** var;

for(var = environ; *var != NULL; ++var)


printf("%s\n", *var);
return 0;

}
UNIVERSIDAD NACIONAL DE SAN ANTONIO ABAD DEL CUSCO
SISTEMAS DE OPERACIONES I
GUIA DE LABORATORIO
ecp 5 de 6

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

Solucin

/*
Nombre : creaProcesoHijo
Objetivo : crea un proceso hijo y muestra su ID
Autor :
FCreacion :
FModificacion :
*/

#include <stdio.h>
#include <sys/types.h>

main()
{
pid_t pid;
pid = fork();
if (pid == 0)
{
//Codigo del proceso hijo
printf("Soy el proceso Hijo. Mi PID es %d\n", getpid());
}
else
{
//Codigo del proceso padre
printf("Soy el proceso Padre. Mi PID es %d\n",getpid());
}
}

f) Escriba un programa que cree N procesos hijo.

Solucin

/*
Nombre : creaNHijos
Objetivo : crea N hijos para un proceso
Autor :
FCreacion :
FModificacion :
*/

#include <stdio.h>
#include <sys/types.h>

main()
{
pid_t pid;
int i;
int n=5;

for (i = 0; i < n; i++)


{
pid = fork();
UNIVERSIDAD NACIONAL DE SAN ANTONIO ABAD DEL CUSCO
SISTEMAS DE OPERACIONES I
GUIA DE LABORATORIO
ecp 6 de 6

if (pid == 0)
break;
}

printf("%d; El padre del proceso %d es %d \n", i, getpid(),


getppid());

5) PRACTICAS DE LABORATORIO

a) Escriba un programa que cree una jerarqua de procesos (con una relacin padre hijo tal
que P0 -> P1 -> P2 -> )
b) 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.
c) Escriba un programa que cree un hijo, espere su terminacin y muestre la informacin de
estado de terminacin del mismo.
d) 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.