Buscar en este blog

lunes, 30 de abril de 2012

Creación de Procesos en Linux

En Linux hay dos funciones para la creación de procesos: fork() y clone(). Las dos crean un nuevo proceso a partir del proceso padre pero de una manera distinta.

Cuando utilizamos la llamada al sistema fork, el proceso hijo creado es una copia exacta del padre (salvo por el PID y la memoria que ocupa). Al proceso hijo se le facilita una copia de las variables del proceso padre y de los descriptores de fichero. Es importante destacar que las variables del proceso hijo son una copia de las del padre (no se refieren físicamente a la misma variable), por lo que modificar una variable en uno de los procesos no se refleja en el otro.

La llamada al sistema clone () es mucho mas genérica y flexible que el fork, ya que nos permite definir qué van a compartir los procesos padre e hijo.

Las llamadas al sistema fork y clone tienen la misma funcionalidad, pero distintas características:

fork: En el momento de la llamada a fork el proceso hijo:
  • Es una copia exacta del padre excepto el PID.
  • Tiene las mismas variables y ficheros abiertos.
  • Las variables son independientes (padre e hijo tienen distintas memorias).
  • Los ficheros son compartidos (heredan el descriptor).
clone: permite especificar qué queremos que compartan padre e hijo.
  • Espacio de direccionamiento
  • Información de control del sistema de archivos (file system)
  • Descriptores de archivos abiertos.
  • Gestores de señales o PID.
Antes de hacer la llamada a fork se encuentra el proceso padre en ejecución. Tras la llamada a fork, según el valor de retorno se tiene que:
  • Menor que cero: Se produjo un error. El proceso original sigue en ejecución.
  • 0: Correspondiente al proceso hijo.
  • Mayor que cero: Correspondiente al proceso padre.
La estructura general para crear un proceso hijo (Hilo) es la siguiente:

pid_t child;
   child = fork();

   if (child < 0) {
     /* Manejar aquí los errores */
   }
   else if (child == 0) {
       /* Código del proceso hijo */
   }
   else {
     /* Código para el proceso padre */
   }

__________________
Fuente: http://www.microsoft.com/technet/default.asp
Fuente: http://tecnicoslinux.com.ar/web/files/procesos.pdf

No hay comentarios:

Publicar un comentario