clone()
Linux 2.6'da iki şey varmış gibi görünüyor.
Bir sistem çağrısı var:
int clone(int (*fn)(void *), void *child_stack,
int flags, void *arg, ...
/* pid_t *ptid, struct user_desc *tls, pid_t *ctid */ );
Bu yaparak açıklanan "klon ()" dir man 2 clone
.
Bu adam sayfasını yeterince okursanız, şunu göreceksiniz:
It is actually a library function layered on top of the
underlying clone() system call.
Görünüşe göre, kafa karıştırıcı olarak aynı adlandırılmış sistem çağrısında bulunan "kütüphane işlevini" kullanarak iş parçacığı uygulamanız gerekiyor.
Kısa bir program yazdım:
#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;
}
İle derleyin:, c99 -Wall -Wextra
ve strace -f
forking ne diyor aslında görmek için sistem koştu . Bunu strace
Linux 2.6.18 makinesinde (x86_64 CPU) çıkardım :
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
Çıkışta "çatal" çağrısı görünmez . clone()
İçinde gösterir yukarı o çağrı strace
çıkışı adam sayfalık-klon çok farklı argümanlar vardır. child_stack=0
ilk argüman farklı olduğundan int (*fn)(void *)
.
fork(2)
Sistem çağrısının tıpkı "kütüphane işlevi" nin uygulandığı gibi gerçek anlamda yapıldığı anlaşılmaktadır . Gerçek insan sayfa-klon gelen argümanlar farklı bir dizi vardır.clone()
clone()
clone()
Basitçe, hem görünüşte çelişkili ifadeleriniz hakkında fork()
hem clone()
de doğru. Bununla birlikte, söz konusu "klon" farklıdır.