systemadmin.es > Kernel > Funcionamiento de la llamda al sistema fork()

Funcionamiento de la llamda al sistema fork()

Mediante la llamada al sistema fork() se crean nuevos procesos en el sistema, vamos a ver su funcionamiento.

Un proceso que hace una llamada a fork() hará que el sistema cree una copia del proceso original (llamado entonces padre) para que los dos procesos sigan sus caminos independientemente. El nuevo proceso, llamado hijo, tiene un nuevo PID. El PPID (parent’s PID) será el del proceso que ha llamado a fork(): el proceso padre.

Para que los proceso sepan diferenciar quien es proceso padre y quien el hijo (y puedan seguir sus caminos) al código de retorno de fork() es diferente del padre que del hijo. En el caso del proceso padre, se le devuelve:

  • PID del proceso hijo si se ha creado
  • -1 si no se ha podido crear el proceso hijo

El proceso hijo, siempre se le devolverá el valor 0, por lo que sabrá que es el hijo. Por esto podemos ver en el código de muchos programas un if acompañado del fork(), aún que así no se toma en consideración si se ha creado correctamente el proceso hijo:

if(fork())
{
  //ejecución del padre
}
else
{
  //ejecución proceso hijo
}

Suponiendo que todo vaya bien el proceso hijo devolverá 0 y ejecutará la parte del else de dicho if.

Proceso padre e hijo después del fork()

Proceso padre e hija después del fork()

La llamada fork() es un proceso relativamente costoso para el sistema, por lo que puede ser aprovechado por un atacante para crear las llamadas fork bombs. Por esto lo ideal es restringir el número de procesos que pueden tener los usuarios no privilegiados.

7 comments to “Funcionamiento de la llamda al sistema fork()”

  1. ¿No hay llamada al sistema para dar la enhorabuena?

    PD: Quizas sea demasiado perpicaz

  2. La llamada sería mediante una pipe o socket para pasar información entre procesos, por lo tanto serviría con write():

    write(id,"muchas gracias!",sizeof("muchas gracias!"));
    
  3. “Me gusta” (Click!)

  4. Que bueno ver de nuevo tus posts 🙂
    Felicitaciones por la paternidad. El mundo nunca tiene suficientes geeks!

  5. Bueno, enhorabuena.

    Lo que no me queda claro es como crear un thread dentro del mismo proceso
    ¿ es posible ?
    ¿ no sería mejor crear un thread ( si es posible ) para paralelizar la ejecución de código ?

    Un saludo

  6. Enhorabuena Jordi!

  7. Para la creación de threads hay otras llamadas, mediante la librería pthreads seria pthread_create()

    Los threads son hilos de ejecución compartiendo memoria, mientras que con fork() se tienen copias independientes (excepto la memoria compartida) por lo que dependiendo del caso necesitas te puede interesar más una cosa que otra

Deja un comentario:

XHTML - Tags permitidos:<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>