Похоже, clone()
в Linux 2.6 есть две вещи
Есть системный вызов:
int clone(int (*fn)(void *), void *child_stack,
int flags, void *arg, ...
/* pid_t *ptid, struct user_desc *tls, pid_t *ctid */ );
Это «clone ()», описанный при выполнении man 2 clone
.
Если вы прочитаете эту справочную страницу достаточно близко, вы увидите это:
It is actually a library function layered on top of the
underlying clone() system call.
По-видимому, вы должны реализовать многопоточность, используя «библиотечную функцию», наложенную на системно вызывающий вызов с однозначным названием.
Я написал короткую программу:
#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;
}
Скомпилировал его с помощью:, c99 -Wall -Wextra
и запустил, strace -f
чтобы увидеть, что на самом деле делают системные вызовы разветвления. Я получил это strace
на машине Linux 2.6.18 (процессор 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)
В strace
выводе не появляется вызов "fork" . clone()
Вызов , который проявляется в strace
выходе имеет очень разные аргументы от человека-страницы-клона. child_stack=0
как первый аргумент отличается от int (*fn)(void *)
.
Похоже, что fork(2)
системный вызов реализован в терминах реального clone()
, точно так же, как clone()
реализована «библиотечная функция» . Реального clone()
имеет другой набор аргументов от человека-страницы-клона.
Проще говоря, оба ваших кажущихся противоречивыми высказывания о fork()
и clone()
являются правильными. Вовлеченный «клон» отличается, однако.