La creación de procesos en Linux implica dos etapas: forking y exec -me tomo la licencia de denominarlas así por las familias de funciones implicadas en cada caso-.
En la etapa de forking se duplica el proceso que realiza la llamada de creación. Para esta duplicación se crea un nuevo process descriptor -estructura donde se guarda la información del proceso- y se agrega a la lista de process descriptors que maneja el kernel. Este nuevo process descriptor es muy similar al del proceso padre pero difiere en el process id y en los procesos hijos -el proceso recién creado no tiene hijos y el proceso padre pasó a tener un hijo más-.
En cuanto al espacio de memoria del nuevo proceso, se utiliza la técnica de copy on write para lograr una mayor optimización. Empleando esta técnica ambos procesos tienen su espacio de memoria pero esta división comienza siendo “virtual”. A medida que se realizan operaciones de escritura en la memoria, se duplican las páginas que corresponden.
La etapa de exec permite la carga en memoria y ejecución de un binario. Veremos en este artículo solo forking.
A continuación la parte más divertida:
#include <stdio .h> #include <stdlib .h> #include <unistd .h> int main(int argc, char* argv[]){ pid_t id_del_proceso_hijo = fork(); pid_t proceso_actual = getpid(); printf("Mensaje de %d: Mi hijo es %d\n", proceso_actual, id_del_proceso_hijo); int* status_ptr = malloc(sizeof(int)); *status_ptr = -1; pid_t estado_del_hijo = waitpid(id_del_proceso_hijo, status_ptr, 0x0); printf("Mensaje de %d: Espere hasta que se reportó el proceso %d. Info del reporte: %d\n", proceso_actual, estado_del_hijo, *status_ptr); return 0; } </unistd></stdlib></stdio>



