Você está na página 1de 3

Práctica 06

Octubre 2017

/* generación de procesos */
fork() crea nuevos procesos en el sistema operativo Unix.
Los siguientes códigos de programa son ejemplos para la creación de
procesos ‘hijos’.
Compile y ejecute en UNIX los programas en lenguaje C y verifique
los valores 'pid' con la orden "ps". Pause el programa para
identificar los “id” de los procesos, puede usarse “getch()” u
alguna otra función.

Librerías que se usan en la creación de procesos son:

/* Includes */
#include <unistd.h> /* Constantes Simbólicas */
#include <sys/types.h> /* Tipos de datos del sistema primitivos */
#include <errno.h> /* Errores */
#include <stdio.h> /* Input/Output */
#include <sys/wait.h> /* Espera por la terminación del proceso */
#include <stdlib.h> /* Utilerías en General */

El siguiente código “fork_0.c” crea un proceso “hijo” en Unix. El


proceso padre “main()” genera al proceso hijo invocando la llamada al
sistema “fork()” y espera a que el hijo termine; el hijo solicita
cualquier letra al usuario, mientras no sea “t”, que en tal caso
terminará el proceso regresando al proceso padre para terminar el
programa.
fork_0.c
int main()
{
pid_t pid;
char c ='a';
/* se cra otro proceso */
pid = fork();
if (pid < 0) { /* ocurrió un error */
fprintf(stderr, "Fork Falló");
exit(-1);
}
else if (pid == 0) { /* proceso hijo */
printf("proceso hijo\n");
printf("ingresa cualquier letra; 't' para terminar\n");
while('t'!=c){
printf("%d ->:", pid);
c=getchar();
}
}
else { /* proceso padre */
/* el proceso padre espera al hijo hasta que termine */
wait (NULL);
printf ("Proceso Padre, esperó a que termine el proceso
hijo\n");


Práctica 06
Octubre 2017

exit(0);
}
}

Desarrollo:

1. Compile y ejecute cada uno de los programas: fork_0.c, fork_1.c,


fork_2.c y fork_3.c

2. Modifique cualquiera de los programas de la práctica para crear


un proceso “nieto”, es decir el proceso “hijo” genera otro
proceso “hijo” o “nieto” para el proceso “main()”. Ejecute el
programa y demuestre mediante el “pid” respectivo que se trata
del proceso padre, el proceso hijo o el proceso nieto.

3. Explique la línea siguiente del programa fork_1.c ¿se ejecuta?


printf("termina proceso hijo \n "); /* se imprime? explique porque? */

4. Determine mediante el “pid” el número de procesos que se ejecutan


para el caso de los programas fork_2.c y fork_3.c.
Reporte para los incisos 2, 3, y 4 los cósus observaciones,
incluyendo la salida de los programas. Recuerde no incluir
imágenes de captura de pantalla, es suficiente y mejor valorado
en modo texto.

fork_1.c
/* Silverschatz, Gavin & Gagne; Operating System Concepts Ninth Edition Figure
3.9, pp 118 */
#include <sys/types.h>
#include <stdio.h>
#include <unistd.h>

int main()
{
pid_t pid;
pid = fork(); /* crea un proceso hijo */
if (pid < 0) { /* occurrió un error*/
fprintf(stderr, "Fork Fallo");
return 1;
}
else if (pid == 0) { /* proceso hijo */
printf("proceso hijo \n ");
execlp("/bin/ls","ls",NULL); /* Código externo */
printf("termina proceso hijo \n "); /* se imprime?
explique porque? */
}
else { /* proceso padre */
wait(NULL); /* proceso padre esperara al hijo a que termine */
printf("Proceso Padre\n Hijo Termino\n");


Práctica 06
Octubre 2017

}
return 0;
}

fork_2.c

/* Silverschatz, Gavin & Gagne; Operating System Concepts Ninth Edition


Figure 3.31, pp 150 */
#include <stdio.h>
#include <unistd.h>
int main()
{
/* fork a child process */
fork();
/* fork another child process */
fork();
/* and fork another */
fork();
return 0;

/* Cuantos procesos se crean, demuéstrelo? */


}

fork_3.c
/* Silverschatz, Gavin & Gagne; Operating System Concepts Ninth Edition
Figure 3.32, pp 151 */

#include <stdio.h>
#include <unistd.h>
int main()
{
int i;
for (i = 0; i < 4; i++)
fork();
return 0;
/* Cuantos procesos se crean?, demuéstrelo */
}

Você também pode gostar