Il semble que deux clone()
éléments flottent dans Linux 2.6
Il y a un appel système:
int clone(int (*fn)(void *), void *child_stack,
int flags, void *arg, ...
/* pid_t *ptid, struct user_desc *tls, pid_t *ctid */ );
C'est le "clone ()" décrit en faisant man 2 clone
.
Si vous lisez suffisamment cette page de manuel, vous verrez ceci:
It is actually a library function layered on top of the
underlying clone() system call.
Apparemment, vous êtes censé implémenter le threading en utilisant la "fonction de bibliothèque" superposée à l'appel système qui porte un nom identique.
J'ai écrit un programme court:
#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;
}
Compilez-le avec: c99 -Wall -Wextra
et parcourez-le strace -f
pour voir ce que font réellement les appels système faisant appel à la fourchette. Je l'ai obtenu strace
sur une machine 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)
Aucun appel "fork" n'apparaît dans la strace
sortie. L' clone()
appel qui apparaît dans la strace
sortie a des arguments très différents de ceux du clone man-page. child_stack=0
comme le premier argument est différent de int (*fn)(void *)
.
Il semble que l' fork(2)
appel système soit implémenté en termes réels clone()
, tout comme la "fonction de bibliothèque" clone()
est implémentée. Le réel clone()
a un ensemble d'arguments différent du clone man-page.
De manière simpliste, vos deux déclarations apparemment contradictoires à propos de fork()
et clone()
sont correctes. Le "clone" impliqué est différent, cependant.