Hauptindex | Abschnitt 2 | Optionen |
int __clone(int (*fn) (void *arg), void *child_stack, int flags, void *arg)
Wird ein Kindprozeß erzeugt, führt er das Funktionsprogramm fn(arg) aus. Das Argument fn zeigt auf eine Funktion, die vom Kindprozeß zu Beginn seiner Ausführung abgearbeitet wird. arg wird dieser Funktion als Argument übergeben.
Kehrt die Funktion fn(arg) zurück, so beendet sich auch der gesamte Kindprozeß. Der Ganzzahlwert, der von fn zurückgeliefert wird, entspricht dem Exit-Code des Kindprozesses. Der Kindprozeß kann auch durch ein explizites exit(1) [Englisch] oder durch ein geeignetes Signal beendet werden.
Das Argument child_stack bestimmt den Ort des Stapelspeichers, der vom Kindprozeß verwendet wird. Da Vater- und Kindprozeß sich Speicherbereiche teilen können, ist es im allgemeinen nicht möglich, beide auf demselben Stapelspeicher ablaufen zu lassen. Der Vaterprozeß muß daher einen Speicherbereich als Stapelspeicher für den Kindprozeß bereithalten und einen Zeiger darauf via __clone an den Kindprozeß übergeben. Mit Ausnahme von HP PA-Maschinen wächst der Stapelspeicher auf allen von Linux unterstützten Prozessoren nach unten, so daß child_stack für gewöhnlich auf die oberste Adresse im bereitgehaltenen Speicherbereich zeigt.
Das untere Byte von flags enthält die Nummer des Signals, das bei Beendigung des Kindprozesses an den Vaterprozeß geschickt werden soll. flags kann darüber hinaus noch durch bitweises Oder mit den folgenden Konstanten verknüpft werden. Dadurch wird festgelegt, welche Ressourcen Vater- und Kindprozeß sich teilen.
CLONE_VM | |
Ist
CLONE_VM gesetzt, laufen Vater- und Kindprozeß im selben Adreßraum. Insbesondere
ist das Resultat von Schreibzugriffen eines Prozesses in den gemeinsamen
Speicher auch vom anderen Prozeß aus sichtbar. Zudem gilt jede
Veränderung der Speichermappings durch
mmap(2)
oder
munmap(2)
für beide Prozesse.
Ist CLONE_VM nicht gesetzt, erhält der Kindprozeß seinen eigenen Adreßraum. Wie auch bei fork(2) bleiben Schreibzugriffe auf den Speicher oder Änderungen am Speichermapping auf den jeweiligen Prozeß beschränkt. | |
CLONE_FS | |
Ist
CLONE_FS gesetzt, teilen sich Vater- und Kindprozeß ihre Informationen über das
Dateisystem. Dazu zählen der Ort des Wurzelverzeichnisses, das aktuelle
Arbeitsverzeichnis und die Maske der Dateizugriffsrechte. Jeder Aufruf von
chroot(2),
chdir(2)
oder
umask(2)
durch entweder den Vater- oder den Kindprozeß beeinflußt auch die
Informationen des jeweils anderen Prozesses.
Ist CLONE_FS nicht gesetzt, erhält der Kindprozeß von __clone eine Kopie der Dateisysteminformationen. Aufrufe von chroot(2), chdir(2) und umask(2) beeinflussen daraufhin lediglich einen der beiden Prozesse. | |
CLONE_FILES | |
Ist
CLONE_FILES gesetzt, teilen sich Vater- und Kindprozeß ihre Dateideskriptoren. Sie
verweisen stets auf dieselbe Datei, sowohl im Vater-, als auch im
Kindprozeß. Jeder Deskriptor, der in einem der beiden Prozesse erzeugt
wird, ist auch im anderen Prozeß gültig. Ebenso wirkt sich das Schließen
eines Deskriptors oder das Ändern der Attribute auf beide Prozesse
zugleich aus.
Ist CLONE_FILES nicht gesetzt, erhält der Kindprozeß durch __clone eine Kopie der aktuell geöffneten Dateideskriptoren. Alle anschließend durchgeführten Operationen auf die Deskriptoren bleiben auf den jeweiligen Prozeß beschränkt. | |
CLONE_SIGHAND | |
Ist
CLONE_SIGHAND gesetzt, teilen sich Vater- und Kindprozeß die Tabelle der Signalhandler.
Ruft einer der beiden Prozesse
sigaction(2)
auf, um das Antwortverhalten auf ein Signal zu verändern, so betrifft dies
auch den anderen Prozeß. Jedoch besitzen Vater- und Kindprozeß nach wie vor
getrennte Signalmasken und getrennte Listen der noch unbearbeiteten Signale.
Einzelne Signale können daher durch Aufruf von
sigprocmask(2)
lokal für einen Prozeß geblockt oder zugelassen werden.
Ist CLONE_SIGHAND nicht gesetzt, erhält der Kindprozeß durch den __clone-Aufruf eine Kopie des Signalhandlers. Ein nachfolgendes sigaction(2) betrifft dann nur noch den aufrufenden Prozeß. | |
CLONE_PID | |
Ist
CLONE_PID gesetzt, erhält der Kindprozeß dieselbe Prozeßkennung wie der Vaterprozeß.
Ist CLONE_PID nicht gesetzt, erhält der Kindprozeß eine eigene Prozeßkennung, unabhängig von der Kennung des Vaterprozesses. | |
EAGAIN | Augenblicklich laufen zu viele andere Prozesse. |
ENOMEM | __clone ist nicht in der Lage, ausreichend viel Speicher anzufordern für die Verwaltungsstrukturen des Kindprozesses oder für die zu kopierenden Bereiche aus der Vaterumgebung. |
Version 5 der libc kennt keinen __clone-Aufruf. Die Nachfolgerversion libc6 (auch glibc2 genannt) stellt __clone in der hier beschriebenen Form zur Verfügung.
Diese Dokumentation basiert auf den Kernelversionen 2.0.x und 2.1.x sowie glibc 2.0.x.
23. Januar 2001 | CLONE (2) | Linux 2.0.33 |
Hauptindex | Abschnitt 2 | Optionen |
Bitte richten Sie Ihre Kommentare zu diesem Handbuch Seite Service, Ben Bullock. Privacy policy.
“ | Modern Unix impedes progress in computer science, wastes billions of dollars, and destroys the common sense of many who seriously use it. | ” |
— The Unix Haters' handbook |