Tampaknya ada dua clone()
hal yang beredar di Linux 2.6
Ada panggilan sistem:
int clone(int (*fn)(void *), void *child_stack,
int flags, void *arg, ...
/* pid_t *ptid, struct user_desc *tls, pid_t *ctid */ );
Ini adalah "clone ()" yang dijelaskan dengan melakukan man 2 clone
.
Jika Anda membaca halaman manual itu cukup dekat, Anda akan melihat ini:
It is actually a library function layered on top of the
underlying clone() system call.
Rupanya, Anda seharusnya menerapkan threading menggunakan "fungsi perpustakaan" berlapis pada panggilan sistem yang identik identik.
Saya menulis sebuah program pendek:
#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;
}
Kompilasi dengan:, c99 -Wall -Wextra
dan jalankan di bawah strace -f
untuk melihat apa yang sebenarnya dilakukan forking panggilan sistem. Saya mendapatkan ini dari strace
pada mesin Linux 2.6.18 (x86_64 CPU):
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)
Tidak ada panggilan "garpu" yang muncul di strace
output. The clone()
panggilan itu menunjukkan sampai di strace
keluaran memiliki argumen yang sangat berbeda dari orang-page-clone. child_stack=0
karena argumen pertama berbeda dari int (*fn)(void *)
.
Tampaknya fork(2)
panggilan sistem diimplementasikan dalam hal yang nyata clone()
, sama seperti "fungsi perpustakaan" clone()
diimplementasikan. The nyata clone()
memiliki seperangkat berbeda dari argumen dari orang-page-clone.
Secara sederhana, kedua pernyataan Anda yang tampaknya saling bertentangan fork()
dan clone()
benar. "Klon" yang terlibat berbeda.