2010-05-24 10 views
5

Me gustaría utilizar las funciones de espaciado de nombres de la función clone. Al leer la página de manual, parece que clone tiene muchos detalles intrincados de los que necesito preocuparme.¿equivalente de clon de la horquilla?

¿Hay una invocación equivalente clone al bueno de 'fork()?

Ya estoy familiarizado con fork, y creo que si tengo un punto de partida en clone, puedo agregar banderas y opciones desde allí.

Respuesta

2

Creo que esto funcionará, pero no estoy del todo seguro acerca de algunos de los argumentos del puntero.

pid_t child = clone(child_f, child_stack, 
      /* int flags    */  SIGCHLD, 
      /* argument to child_f  */  NULL, 
      /* pid_t *pid    */  NULL, 
      /* struct usr_desc * tls */  NULL, 
      /* pid_t *ctid    */  NULL); 

En las banderas parámetro el byte inferior de la misma se utiliza para especificar qué señal a enviar a notificar a los padres de la rosca haciendo cosas como la muerte o la parada. Creo que todas las banderas actuales activan interruptores que son diferentes de fork. Mirar el código del núcleo sugiere que este es el caso.

Si realmente desea obtener algo cercano a fork, puede llamar al sys_clone que no toma el puntero de función y en su lugar retorna dos veces como fork.

+0

Fui code-diving porque todavía no me sentía cómodo, pero parece que tienes razón. Lo que encontré es que 'clone' es una envoltura muy delgada alrededor de' sys_clone', principalmente haciendo lo que es necesario para llamar a 'fn' en la nueva pila. 'sys_clone' en realidad retorna como' fork', pero no se puede invocar directamente, porque su firma difiere según la arquitectura. 'fork' es realmente bastante gordo: ejecuta devoluciones de llamada, realiza una limpieza incorrecta, pero básicamente usa SIGCHLD. (Supongo que no hay nada que pueda hacer para emular el 'fork'-extras.) –

0

clone() se utiliza para crear un hilo. La gran diferencia entre clone() y fork() es que clone() está destinado a ejecutarse comenzando en un punto de entrada separado, una función, mientras que fork() simplemente continúa hacia abajo desde el mismo punto en el código desde el que se invocó. int (* fn) (void *) en la definición de la página de manual es la función, que al salir devuelve un int, el estado de salida.

La llamada más cercana a clonar es pthread_create() que es esencialmente un contenedor para clone(). Esto no te permite obtener el comportamiento fork().

+1

Buen punto. No estoy demasiado preocupado por la diferencia 'fn' vs.' return' entre 'clone' y' fork'. Mi objetivo es entender cómo obtener las mismas características de subproceso (y lo que son). En cualquier caso, 'pthread_create' no me ofrece los marcadores de espacios de nombres. –

1

Puede bifurcar un proceso secundario normal utilizando fork(), luego use unshare() para crear un nuevo espacio de nombres.

Los espacios de nombres son un poco raros, no puedo ver una gran cantidad de casos de uso para ellos.

+1

Parece que' unshare' solo admite un pequeño subconjunto de las banderas 'clone'. Por ejemplo, quiero usar 'CLONE_NEWNET', y devuelve' EINVAL'. –