Parece que hay dos clone()
cosas flotando en Linux 2.6
Hay una llamada al sistema:
int clone(int (*fn)(void *), void *child_stack,
int flags, void *arg, ...
/* pid_t *ptid, struct user_desc *tls, pid_t *ctid */ );
Este es el "clon ()" descrito haciendo man 2 clone
.
Si lees esa página de manual lo suficientemente cerca, verás esto:
It is actually a library function layered on top of the
underlying clone() system call.
Aparentemente, se supone que debe implementar subprocesos utilizando la "función de biblioteca" en capas en la llamada al sistema confusamente identificada.
Escribí un breve programa:
#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>
int
main(int ac, char **av)
{
pid_t cpid;
switch (cpid = fork()) {
case 0: // Child process
break;
case -1: // Error
break;
default: // parent process
break;
}
return 0;
}
Lo compilé con: c99 -Wall -Wextra
y lo ejecuté strace -f
para ver qué hace realmente la bifurcación de llamadas del sistema. strace
Obtuve esto en una máquina Linux 2.6.18 (CPU x86_64):
20097 clone(child_stack=0, flags=CLONE_CHILD_CLEARTID|CLONE_CHILD_SETTID|SIGCHLD, child_tidptr=0x2b4ee9213770) = 20098
20097 exit_group(0) = ?
20098 exit_group(0)
No aparece la llamada "fork" en la strace
salida. La clone()
llamada que aparece en la strace
salida tiene argumentos muy diferentes del clon de página de manual. child_stack=0
como primer argumento es diferente int (*fn)(void *)
.
Parece que la fork(2)
llamada al sistema se implementa en términos reales clone()
, al igual que clone()
se implementa la "función de biblioteca" . Lo real clone()
tiene un conjunto diferente de argumentos del clon de la página de manual.
Simplísticamente, sus dos declaraciones aparentemente contradictorias sobre fork()
y clone()
son correctas. Sin embargo, el "clon" involucrado es diferente.