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 espacio de memoria, la tabla de descriptores de fichero y la tabla de manejadores de señales (signal handler). El uso que habitualmente se le da a clone es para implementar hilos de ejecución (threads): múltiples hilos de ejecución de control en un programa que corre en un espacio de memoria compartido.

 La función clone está definida en el archivo de cabecera sched.h y esta es su firma:

int clone (int (*fn) (void *), void *child_stack, int flags, void *arg);

    Cuando se crea un proceso hijo con clone se ejecuta la función fn(arg). El argumento fn es un puntero a una función. El entero que debe retornar esa función será el código de salida del proceso hijo. El proceso hijo podría también finalizar explicitamente mediante una llamada a exit o después de recibir una señal fatal.

    El argumento child_stack especifica la posición de la pila usada por el proceso hijo. Ya que el proceso hijo y el padre pueden compartir la misma memoria, no es posible que el proceso hijo ejecute la misma pila que el proceso padre. El proceso padre (el que invoca la función clone) prepara un espacio de memoria para la pila del hijo y le pasa un puntero a este espacio mediante este argumento.

    El argumento entero flag es un OR de varias constantes que especifican que es compartido entre padre e hijo:

CLONE_PARENT, CLONE_FS, CLONE_FILES, CLONE_NEWSNS, CLONE_SIGHAND, CLONE_PTRACE, CLONE_UNTRACED, CLONE_STOPPED, CLONE_VFORK, CLONE_VM, CLONE_PID, CLONE_THREAD, CLONE_SYSVEM, CLONE_SETTLS, CLONE_PARENT_SETTID, CLONE_CHILD_SETTID, CLONE_CHILD_CLEARID

    clone es una función que realiza un llamada de sistema (system call) a sys_clone que sólo precisa los argumentos flags y child_stack que tienen el mismo significado que para el caso de la función.

    La función clone retorna el TID (Thread ID, identificador del hilo) o -1 en caso de fallo y errno será asignado apropiadamente describiendo el error.

    A continuación vemos un ejemplo sencillo de la utilización de esta función:

#include <sched.h>
#include <stdio.h>
#include  <time.h>
#include  <malloc.h>

int cloneando()
{
        printf("Hola mundo clonado\n");
}
int main(int argc,char** argv)
{
        void **pila_hijo;
        pila_hijo = malloc(1000);
        clone(cloneando,pila_hijo, CLONE_VM|CLONE_FILES, NULL);
        sleep(1);
        printf("Hola mundo real\n");

        return 0;
}

    Espero que el articulo os sirva de ayuda, pero si necesitáis alguna aclaración escribid un comentario a este artículo

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *