Un proceso es la unidad b谩sica de ejecuci贸n de cualquier sistema operativo, y en la actualidad muchos de estos sistemas operativos hacen uso de multiprocesos, es decir, creaci贸n de varios procesos para la ejecuci贸n de una tarea espec铆fica.
En los sistemas operativos se tiene un 谩rbol de procesos debido a que cada vez que un proceso nuevo es creado (proceso hijo), este contiene la informaci贸n del que lo creo (proceso padre). De igual forma, los procesos hijo pueden crear subprocesos, convirti茅ndose estos primeros en procesos padre.
Funci贸n fork()
Sintaxis
pid_t fork(void);
Dependencias
#include <sys/types.h> #include <unistd.h>
La funci贸n fork() regresa tres diferentes valores:
- Menor a cero si la fallo la creaci贸n del proceso (<0)
- Igual a cero cuando se ejecuta el c贸digo del hijo (proceso creado) (=0)
- Mayor a cero si se ejecuta el c贸digo del padre (>0)
Por 煤ltimo, la ejecuci贸n de cada bloque de c贸digo en la bifurcaci贸n se realiza de manera diferente cada vez que se ejecuta el programa debido a que esta es determinada por el planificador de procesos de cada sistema opertivo.
Funci贸n wait()
Sintaxis
pid_t wait(int *status); pid_t waitpid(pid_t pid, int *status, int options);
Dependencias
#include <sys/types.h> #include <sys/wait.h>
Descripci贸n
Wait es una llamada al sistema que a grandes rasgos detiene la ejecuci贸n de un proceso padre hasta que alguno de sus hijos termina. Este comportamiento puede cambiar seg煤n las opciones que le sean pasadas a esta funci贸n.
La funci贸n wait suspende la ejecuci贸n del proceso actual hasta que un proceso hijo ha terminado, o hasta que se produce una se帽al cuya acci贸n es terminar el proceso actual o llamar a la funci贸n manejadora de la se帽al. Si un hijo ha salido cuando se produce la llamada (lo que se entiende por proceso "zombie"), la funci贸n vuelve inmediatamente. Todos los recursos del sistema reservados por el hijo son liberados.
Creacion de arbol de procesos.
El siguiente programa crea un 谩rbol de procesos que muestra el id del padre si se esta ejecutando el c贸digo del hijo, o el id de los hijos en el caso de que sea un proceso padre el que se encuentra en ejecici贸n.
#include <stdio.h> #include <unistd.h> #include <sys/wait.h> #include <sys/types.h> int main(char *argv[]) { int pid, pidi, pidj; int i, j, k, l; int sti, stj; int tprocess[3][2]; int ttprocess[3]; pid = fork(); if (!pid) { for (i = 0; i < 3; i++) { pidi = fork(); if (pidi == 0) { for (j = 0; j < 2; j++) { pidj = fork(); if (pidj == 0) { printf("Mi id es %d y el de mi padre es: %d\n", getpid(), getppid()); exit(0); } tprocess[i][j] = pidj; } if (pidj != 0) { for (k = 0; k < 2; k++) waitpid(tprocess[i][k], &stj, 0); printf("Soy el padre: %d y mis hijos son:", getpid()); for (k = 0; k < 2; k++) printf(" %d ", tprocess[i][k]); printf("\n"); exit(0); } } ttprocess[i] = pidi; } if (pidi != 0) { for (l = 0; l < 3; l++) waitpid(ttprocess[l], &sti, 0); printf("Soy el padre: %d y mis hijos son:", getpid()); for (l = 0; l < 3; l++) printf(" %d ", ttprocess[l]); printf("\n"); } } }
Para ejecutar el codigo solo es necesario ejecutar el siguiente comando:
gcc fork1.c -o fork1
./fork1La salida deber ser algo asi:

NOTA: Las funciones getpid() y getppid() sirven para obtener el id del proceso en ejecuci贸n,
o el id del padre del proceso actual (en caso de que exista,
de lo contrario regresar谩 un numero negativo).

