Fork en Linux

17 03 2008 Programación
    Existen multitud de programas que mantienen varios procesos para poder atender distintas tareas, resolver en paralelo una tarea compleja o ser más eficientes en las respuestas al usuario. Para ello el programa debe ser capaz de lanzar procesos hijos con capacidad para realizar distintas tareas. Cada proceso es completamente independiente pero puede comunicarse con otros empleando fifos o memoria compartida. Una de las estrategias principales que se emplean con este tipo de programa multiproceso es crear un padre y varios hijos, el padre gestiona la creación, destrucción y administración de los procesos hijos. Un buen ejemplo de este comportamiento lo tenemos en el servidor web apache funcionando en modo MPM (Multi-processing Module). Utiliza una estrategia de este tipo para atender múltiples peticiones simultaneas http procedentes de clientes externos. Veamos como consigue hacer esto.

    Para poder iniciar procesos adicionales en una máquina GNU/Linux, procesos adicionales al que se están ejecutando, se emplea el comando fork cuya firma es la siguiente

pid_t fork(void);

    Su definición se encuentra en los archivos de cabecera sys/types.h y unistd.h. En unistd.h está definida la función y en types.h el tipo pid_t que no es más que un identificador de proceso linux PID.

    Fork crea un proceso hijo que se diferencia de su creador únicamente por su PID y por su PPID (Parent PID, identificador del proceso padre del proceso actual). Además el proceso hijo no hereda los bloqueos de fichero ni las señales pendientes de su padre, en otro artículo hablaremos del clone que si los hereda.

    Tras la creación del proceso hijo ambos procesos son ejecutados en "paralelo", es decir, tenemos dos procesos ejecutando el código del programa. La diferencia entre los dos se haya en lo que devuelve la llamada al fork. En cada uno de esos procesos este valor es diferente, para el proceso padre fork devuelve el PID del proceso recién creado y para el proceso recién creado fork devuelve 0, además el PPID del proceso recién creado es el PID del proceso padre (lógico).

    Para conocer el PID y el PPID de un proceso se pueden emplear las funciones getpid y getppid respectivamente. Nuevamente estas funciones están definidas en el archivo de cabecera unistd.h con la siguiente firma:

__pid_t getpid (void)
__pid_t getppid (void)

Ejemplo de fork:


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

int main(int argc, char *argv[])
{
pid_t pid;

pid = fork();

if(pid==-1)
{
printf("Fallo al forkear\n");
return -1;
}
else if (!pid)
{
printf("Proceso hijo: PID %d - PPID %d\n", getpid(), getppid());
}
else
{
printf("Proceso padre: PID %d - PPID %d\n", getpid(), getppid());
}
return 0;
}


    Prueba el programa y observa su salida.

    Nota: si quieres conocer el PID del proceso bash de tu consola puedes ejecutar

$ echo $$

    Este debería corresponderse con el PPID del proceso padre que acabas de crear

    Seguiremos con este tema en próximos días




Bookmark Fork en Linux  at del.icio.us Digg Fork en Linux Mixx Fork en Linux Bloglines Fork en Linux Technorati Fork en Linux Fark this: Fork en Linux Bookmark Fork en Linux  at YahooMyWeb Bookmark Fork en Linux  at Furl.net Bookmark Fork en Linux  at reddit.com Bookmark Fork en Linux  at blinklist.com Bookmark Fork en Linux  at Spurl.net Bookmark Fork en Linux  at NewsVine Bookmark Fork en Linux  at Simpy.com Bookmark Fork en Linux  at blogmarks Bookmark Fork en Linux  with wists Bookmark Fork en Linux  at Ma.gnolia.com wong it! Bookmark using any bookmark manager! Stumble It!

Referencias


19 03 2008
wait, waitpid y waitid, gestion de multiples procesos
    Tras ver como se pueden generar varios procesos empleando fork ahora veremos como podemos controlar sus tiempos de ejecución con wait, waitpid y waitid.     Esta es la firma de las dos primeras funciones:
Weblog: Novanebula blog
Tracked: Mar 19, 00:43
19 03 2008
Clone en Linux
    La función clone realiza una tarea similar a fork, crear procesos hijos al proceso que lo ejecuta. A diferencia del fork, clone permite que el proceso hijo comparta partes de su contexto de ejecución con el proceso padre, como el e
Weblog: Novanebula blog
Tracked: Mar 19, 20:52

Comentarios

Mostrar comentarios como (Plano | Hilos)
No hay comentarios

Añadir comentario


Encerrando entre asteriscos convierte el texto en negrita (*palabra*), el subrayado es hecho así: _palabra_.
Smilies normales como :-) y ;-) son convertidos en imágenes.