Fork en Linux
17 03 2008
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:
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
Comentarios :
No hay comentarios »
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
Categorías : Programación
Referencias : 2 Referencias »



Tracked: Mar 19, 00:43
Tracked: Mar 19, 20:52