Archive for the ‘C’ Category

C: clone()

La llamada al sistema clone es mucho más genérica y flexible que el fork, ya que nos permite definir qué van a compartir los procesos padre e hijo.
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.

En el clone el hijo en principio dispondrá de exactamente los mismos campos del task_struct del padre y sólo realizará una copia de estos en caso de modificar alguno de ellos. Si esto ocurre debe asignarsele al hijo su propio PID.

Share

C: fork()

Cuando se hace una llamada 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.

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).

En el fork() el hijo creado obtiene una copia de todos los campos del task_struct del padre y su propio identificador.

#include <stdio.h>
#include <unistd.h>

Void main() {
  pid_t pID = fork();
  if (pID == 0) {
    // Hijo
    printf("¡¡¡Soy el hijo!!!");
  }else if (pID > 0) {
    // Padre
    printf("¡¡¡Soy el padre!!!");
  }else {
    // Error al hacer el fork
    // Throw exception
    printf("¡¡¡Error!!!");
  }
}

Referencias:

Linux cross reference
http://lxr.linux.no/

Share

C : Hola mundo!

Todo camino empieza con un paso :

#include <stdio.h>

int main()
{
        printf("Hola mundo");
        return 0;
}
Share