Sembra che ci siano due clone()
cose fluttuanti in Linux 2.6
C'è una chiamata di sistema:
int clone(int (*fn)(void *), void *child_stack,
int flags, void *arg, ...
/* pid_t *ptid, struct user_desc *tls, pid_t *ctid */ );
Questo è il "clone ()" descritto facendo man 2 clone
.
Se leggi quella pagina man abbastanza vicino, vedrai questo:
It is actually a library function layered on top of the
underlying clone() system call.
Apparentemente, dovresti implementare il threading usando la "funzione di libreria" stratificata sulla chiamata di sistema confusamente identica.
Ho scritto un breve programma:
#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;
}
Compilato con:, c99 -Wall -Wextra
ed eseguito sotto strace -f
per vedere cosa fanno effettivamente le chiamate di sistema. Ho ottenuto questo da strace
una macchina 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)
Nessuna chiamata "fork" appare strace
nell'output. La clone()
chiamata che appare strace
nell'output ha argomenti molto diversi dal clone di man-page. child_stack=0
poiché il primo argomento è diverso da int (*fn)(void *)
.
Sembra che la fork(2)
chiamata di sistema sia implementata in termini reali clone()
, proprio come la "funzione di libreria" clone()
è implementata. Il reale clone()
ha una serie di argomenti diversa dal clone di man-page.
Semplicisticamente, entrambe le tue dichiarazioni apparentemente contraddittorie su fork()
e clone()
sono corrette. Il "clone" coinvolto è però diverso.