Provided by: manpages-de-dev_2.16-1_all bug

BEZEICHNUNG

       clone, __clone2 - erzeugt einen Kindprozess

ÜBERSICHT

       /* Prototyp für die Glibc-Wrapper-Funktion */

       #define _GNU_SOURCE
       #include <sched.h>

       int clone(int (*fn)(void *), void *child_stack,
                 int flags, void *arg, 
                 /* pid_t *ptid, void *newtls, pid_t *ctid */ );

       /* Für den Prototyp des den rohen Systemaufrufs siehe ANMERKUNGEN */

BESCHREIBUNG

       clone() erzeugt auf eine ähnliche Weise wie fork(2) einen neuen Prozess.

       Diese  Seite  beschreibt  sowohl  die  clone()-Wrapper-Funktion  von  Glibc  als  auch den
       darunterliegenden  Systemaufruf,  auf  dem  sie  basiert.  Der   Haupttext   erklärt   die
       Wrapper-Funktion.  Die  Unterschiede zum rohen Systemaufruf werden gegen Ende dieser Seite
       erläutert.

       Im Gegensatz zu fork(2) erlaubt clone(), dass der Kindprozess Teile seines  Kontextes  mit
       dem  aufrufenden  Prozess  teilt.  Dazu  zählen  der virtuelle Adressraum, die Tabelle der
       Dateideskriptoren und die Tabelle der Signal-Handler.  (Beachten  Sie,  dass  »aufrufender
       Prozess«  auf dieser Handbuchseite »Elternprozess« entspricht. Aber lesen Sie im Folgenden
       die Beschreibung von CLONE_PARENT.)

       clone() wird  benutzt,  um  Threads  zu  implementieren:  mehrere  Steuerflüsse  in  einem
       Programm, die gleichzeitig in einem gemeinsamen Speicherbereich ausgeführt werden.

       Wird  mit  clone()  ein  Kindprozess  erzeugt,  beginnt es die Ausführung durch Aufruf der
       Funktion, auf die das Argument fn zeigt. (Dies ist ein  Unterschied  zu  fork(2),  wo  die
       Ausführung  im Kindprozess vom Punkt des fork(2)-Aufrufs fortfährt.) Das Argument arg wird
       als Argument der Funktion fn übergeben.

       Kehrt die Funktion fn(arg) zurück, so beendet sich der Kindprozess. Der Ganzzahlwert,  der
       von fn zurückgeliefert wird, entspricht dem Exit-Status des Kindprozesses. Der Kindprozess
       kann auch durch den expliziten Aufruf von exit(2) oder durch  den  Empfang  eines  fatalen
       Signals beendet werden.

       Das  Argument  child_stack  bestimmt  den  Ort  des  Stapelspeichers,  der vom Kindprozess
       verwendet wird. Da der aufrufende und der Kindprozess sich Speicherbereiche teilen können,
       kann  der  Kindprozess  nicht  auf  dem  selben  Stapelspeicher wie der aufrufende Prozess
       laufen. Der aufrufende Prozess muss daher einen Speicherbereich als Stapelspeicher für den
       Kindprozess  bereithalten  und per clone einen Zeiger darauf an den Kindprozess übergeben.
       Der Stapelspeicher wächst (mit Ausnahme der PA-Prozessoren von HP)  auf  allen  von  Linux
       unterstützten  Prozessoren  nach unten, so dass child_stack für gewöhnlich auf die oberste
       Adresse im bereitgehaltenen Speicherbereich zeigt.

       Das niederwertige Byte von flags enthält die Nummer des  Beendigungssignals,  das  an  den
       Elternprozess  gesandt  wird,  wenn  der  Kindprozess endet. Falls dieses Signal als etwas
       anderes als SIGCHLD angegeben wurde, dann muss der Elternprozess die Optionen __WALL  oder
       __WCLONE  angeben,  wenn  er  mit  wait(2)  auf  den Kindprozess wartet. Falls kein Signal
       angegeben wurde, wird dem Elternprozess nicht signalisiert, wenn der Kindprozess endet.

       flags kann darüber hinaus noch  durch  bitweises  »ODER«  mit  keiner  oder  mehreren  der
       folgenden  Konstanten  verknüpft  werden.  Dadurch wird festgelegt, welche Ressourcen sich
       Eltern- und Kindprozess teilen:

       CLONE_CHILD_CLEARTID (seit Linux 2.5.49)
              Die Kind-Thread-Kennung an der Stelle ctid  im  Kindspeicher  bereinigen  (nullen),
              wenn das Kind existiert und beim Futex (»fast userspace mutual exclusion«/schneller
              gegenseitiger Ausschluss im Userspace) an  dieser  Adresse  aufwachen  lassen.  Die
              betroffene  Adresse  könnte  durch  den  Systemaufruf  set_tid_address(2)  geändert
              werden. Dies wird von Threading-Bibliotheken benutzt.

       CLONE_CHILD_SETTID (seit Linux 2.5.49)
              Speichert  die  Kind-Thread-Kennung  an  der  Stelle  ctid  im  Kindspeicher.   Die
              Speicheraktion  wird abgeschlossen, bevor clone() die Steuerung an den Benutzerraum
              im Kindprozess zurückgibt.  (Beachten  Sie,  dass  die  Speicheraktion  noch  nicht
              abgeschlossen  sein  könnte,  bevor  clone()  den  Elternprozess zurückliefert, was
              relevant wird, wenn auch der Schalter CLONE_VM eingesetzt wird.)

       CLONE_FILES (since Linux 2.0)
              Ist CLONE_FILES gesetzt, teilen  sich  der  aufrufende  und  der  Kindprozess  ihre
              Dateideskriptor-Tabellen.  Jeder  Dateideskriptor,  der im aufrufenden Prozess oder
              vom Kindprozess erzeugt wird, ist auch im anderen Prozess gültig. Ebenso wirkt sich
              das  Schließen  eines  Dateideskriptors  oder  das  Ändern der zugehörigen Schalter
              (benutzen der F_SETFD-Operation von fcntl(2)) auf den anderen  Prozess  aus.  Falls
              sich  ein  Prozess  eine  Dateideskriptor-Tabelle teilt und execve(2) aufruft, wird
              seine Dateideskriptor-Tabelle dupliziert (nicht länger geteilt).

              Ist CLONE_FILES nicht gesetzt, erbt der Kindprozess zur Ausführungszeit von clone()
              eine  Kopie  der  aktuell geöffneten Dateideskriptoren. Anschließende Aktionen, die
              Dateideskriptoren öffnen oder schließen bzw. deren Schalter ändern, werden entweder
              vom  aufrufenden  Prozess oder dem Kindprozess durchgeführt und betreffen nicht den
              jeweils  anderen  Prozess.  Beachten  Sie  aber,   dass   sich   die   duplizierten
              Dateideskriptoren   im  Kind  auf  die  gleiche  offene  Dateideskription  wie  der
              korrespondierende Dateideskriptor im aufrufenden Prozess bezieht und sich daher den
              Dateiversatz und die Dateistatusschalter mit diesem teilt (siehe open(2)).

       CLONE_FS (seit Linux 2.0)
              Ist  CLONE_FS  gesetzt,  teilen  sich  aufrufender  Prozess  und  Kindprozess  ihre
              Informationen über das Dateisystem. Dazu zählen der Ort  des  Wurzelverzeichnisses,
              das  aktuelle  Arbeitsverzeichnis  und  die  Maske der Dateizugriffsrechte (umask).
              Jeder Aufruf von chroot(2), chdir(2) oder umask(2), entweder durch den  aufrufenden
              Prozess oder den Kindprozess, beeinflusst auch den jeweils anderen Prozess.

              Ist  CLONE_FS  nicht  gesetzt, arbeitet der Kindprozess von clone() mit einer Kopie
              der   Dateisysteminformationen   des   aufrufenden   Prozesses   zur    Zeit    des
              clone()-Aufrufs. Spätere Aufrufe von chroot(2), chdir(2) oder umask(2) beeinflussen
              den anderen Prozess nicht.

       CLONE_IO (seit Linux 2.6.25)
              Ist CLONE_FS gesetzt, teilt  sich  der  neue  Prozess  einen  E/A-Kontext  mit  dem
              aufrufenden Prozess. Falls dieser Schalter nicht gesetzt ist (wie bei fork(2)), hat
              der neue Prozess seinen eigenen E/A-Kontext.

              Der E/A-Kontext entspricht dem E/A-Gültigkeitsbereich des  Platten-Steuerprogramms,
              d.h.  welches  das  E/A-Steuerprogramm  zur  Modellplanung  für  E/As des Prozesses
              benutzt. Falls sich Prozesse  den  gleichen  E/A-Kontext  teilen,  werden  sie  vom
              E/A-Steuerprogramm  als  ein  einziger betrachtet. Als Konsequenz daraus müssen sie
              sich  die  gleiche  Plattenzeitzugriffzeit   teilen.   Einige   E/A-Steuerprogramme
              ermöglichen  zwei  Prozessen, die einen E/A-Kontext teilen, ihren Plattenzugriff zu
              verzahnen. Falls mehrere Prozesse E/A im Auftrag des gleichen Prozesses durchführen
              (aio_read(3)  zum  Beispiel),  sollten  sie  für eine bessere E/A-Leistung CLONE_IO
              verwenden.

              Falls der Kernel nicht mit der  Option  CONFIG_BLOCK  konfiguriert  wurde,  bewirkt
              dieser Schalter nichts.

       CLONE_NEWCGROUP (seit Linux 4.6)
              Erstellt  den Prozess in einem neuen cgroup-Namensraum. Falls dieser Schalter nicht
              gesetzt  ist,  dann  wird  (wie  mit  fork(2))  der   Prozess   in   den   gleichen
              cgroup-Namensräumen  wie  der aufrufende Prozess erstellt. Der Schalter ist für die
              Implementierung von Containern gedacht.

              Weitere    Informationen    über    cgroup-Namensräume     finden     Sie     unter
              cgroup_namespaces(7).

              Nur ein privilegierter Prozess (CAP_SYS_ADMIN) kann CLONE_NEWCGROUP angeben.

       CLONE_NEWIPC (seit Linux 2.6.19)
              Ist  CLONE_NEWIPC  gesetzt,  dann  wird  der  Prozess in einem neuen IPC-Namensraum
              erstellt. Falls dieser Schalter nicht gesetzt ist, dann wird der Prozess  (wie  bei
              fork(2))  im  gleichen  IPC-Namensraum  wie der aufrufende Prozess erstellt. Dieser
              Schalter ist für die Implementierung von Containern gedacht.

              Ein IPC-Namensraum stellt eine isolierte Ansicht von  System-V-IPC-Objekten  (siehe
              sysvipc(7))    und    (seit    2.6.30)    POSIX-Nachrichtenwarteschlangen    (siehe
              mq_overview(7)) bereit. Das gemeinsame Merkmal  dieser  IPC-Mechanismen  ist,  dass
              IPC-Objekte durch andere Mechanismen als Dateisystempfadnamen identifiziert werden.

              Objekte,  die  in  einem  IPC-Namensraum  erstellt  wurden,  sind  für alle anderen
              Prozesse sichtbar, die Mitglieder des Namensraums sind.  Die  Objekte  sind  jedoch
              nicht für Prozesse in anderen Namensräumen sichtbar.

              Wenn  ein  IPC-Namensraum zerstört wird, d.h. wenn der letzte Prozess im Namensraum
              beendet wird, werden alle IPC-Objekte im Namensraum automatisch zerstört.

              Nur ein privilegierter Prozess (CAP_SYS_ADMIN) kann  CLONE_NEWIPC  angeben.  Dieser
              Schalter darf nicht zusammen mit CLONE_SYSVSEM angegeben werden.

              Weitere Informationen zu IPC-Namensräumen finden Sie in namespaces(7).

       CLONE_NEWNET (seit Linux 2.6.24)
              (Die  Implementierung  dieses  Schalters wurde erst ungefähr mit der Kernel-Version
              2.6.29 abgeschlossen.)

              Wenn  CLONE_NEWNET  gesetzt  ist,  dann   wird   der   Prozess   in   einem   neuen
              Netzwerk-Namensraum  erstellt.  Falls  dieser Schalter nicht gesetzt ist, dann wird
              der Prozess (wie mit fork(2)) im gleichen Netzwerk-Namensraum  wie  der  aufrufende
              Prozess  erstellt.  Dieser  Schalter  ist  für  die  Implementierung von Containern
              gedacht.

              Ein Netzwerk-Namensraum stellt eine isolierte Ansicht des  Netzwerk-Stapelspeichers
              (Netzwerkgeräteschnittstellen,     IPv4-     und     IPv6-Protokoll-Stapelspeicher,
              IP-Routing-Tabellen,   Firewall-Regeln,   die   Verzeichnisbäume   /proc/net    und
              /sys/class/net,  Sockets,  etc.) bereit. Ein physisches Netzwerkgerät kann in genau
              einem Netzwerknamensraum  bestehen.  Ein  virtuelles  Netzwerkgerätepaar  (veth(4))
              stellt  eine  einer  Pipe  ähnliche Abstraktion bereit, die benutzt werden kann, um
              Tunnel zwischen Netzwerk-Namensräumen aufzubauen und eine Brücke in ein  physisches
              Netzwerkgerät in einem anderen Namensraum zu erstellen.

              Wenn  ein  Netzwerk-Namensraum  freigegeben  wird,  d.h. wenn der letzte Prozess im
              Namensraum beendet wird, werden  seine  physischen  Netzwerkgeräte  zurück  in  den
              ursprünglichen   Namensraum   verschoben   (nicht   zum   Elternprozess).   Weitere
              Informationen zu Netzwerk-Namensräumen finden Sie in namespaces(7).

              Nur ein privilegierter Prozess (CAP_SYS_ADMIN) kann CLONE_NEWNET angeben.

       CLONE_NEWNS (seit Linux 2.4.19)
              Wenn der Schalter CLONE_NEWNS gesetzt ist, wird der geklonte Kindprozess  in  einem
              neuen,  eingehängten  Namensraum gestartet, der mit einer Kopie des Namensraums des
              Elternprozesses initialisiert wurde. Wenn CLONE_NEWNS nicht gesetzt ist, bleibt der
              Kindprozess im gleichen Namensraum wie der Elternprozess.

              Nur ein privilegierter Prozess (einer der die Fähigkeit CAP_SYS_ADMIN hat) kann den
              Schalter CLONE_NEWNS angeben. Es ist nicht erlaubt,  sowohl  CLONE_NEWNS  als  auch
              CLONE_FS im gleichen Aufruf von clone() anzugeben.

              Für  weitere  Informationen  über  Einhängenamensräume  lesen Sie namespaces(7) und
              mount_namespaces(7)

       CLONE_NEWPID (seit Linux 2.6.24)
              Wenn CLONE_NEWPID gesetzt ist, dann wird der Prozess in einem neuen  PID-Namensraum
              erstellt.  Falls dieser Schalter nicht gesetzt ist (wie mit fork(2)), dann wird der
              Prozess in dem gleichen PID-Namensraum wie der  aufrufende  Prozess  erstellt.  Der
              Schalter ist für die Implementierung von Containern gedacht.

              Weitere   Informationen   zu  PID-Namensräumen  finden  Sie  in  namespaces(7)  und
              pid_namespaces(7).

              Nur ein privilegierter Prozess (CAP_SYS_ADMIN) kann  CLONE_NEWPID  angeben.  Dieser
              Schalter darf nicht zusammen mit CLONE_THREAD oder CLONE_PARENT angegeben werden.

       CLONE_NEWUSER
              (Dieser  Schalter  hatte  für  clone() erstmals in Linux 2.6.23 eine Bedeutung, die
              aktuelle clone()-Semantik wurde in Linux 3.5 aufgenommen und die  letzten  Anteile,
              um   Benutzernamensräume   komplett  nutzbar  zu  bekommen,  wurden  in  Linux  3.8
              aufgenommen.)

              Wenn  CLONE_NEWUSER  gesetzt  ist,  dann  wird   der   Prozess   in   einem   neuen
              Benutzer-Namensraum  erstellt.  Falls  dieser Schalter nicht gesetzt ist, dann wird
              der Prozess (wie mit fork(2)) im gleichen Benutzer-Namensraum  wie  der  aufrufende
              Prozess erstellt.

              Vor  Linux 3.8 verlangte die Verwendung von CLONE_NEWUSER, dass der Aufrufende drei
              Capabilities hatte: CAP_SYS_ADMIN, CAP_SETUID und CAP_SETGID. Seit Linux 3.8 werden
              für die Erstellung eines Benutzernamensraums keine Privilegien benötigt.

              Dieser  Schalter  kann  nicht zusammen mit CLONE_THREAD oder CLONE_PARENT angegeben
              werden. Aus Sicherheitsgründen  darf  CLONE_NEWUSER  nicht  zusammen  mit  CLONE_FS
              angegeben werden.

              Für  weitere  Informationen  über  Benutzernamensräume  lesen Sie namespaces(7) und
              user_namespaces(7).

       CLONE_NEWUTS (seit Linux 2.6.19)
              Falls CLONE_NEWUTS gesetzt ist, erzeugt der  Prozess  einen  neuen  UTS-Namensraum,
              dessen  Bezeichner  durch  Duplizieren  der  Bezeichner  aus dem UTS-Namensraum des
              aufrufenden Prozesses initialisiert werden. Wenn dieser Schalter nicht gesetzt  ist
              (wie  mit  fork(2)),  dann  wird  der  Prozess  im  gleichen UTS-Namensraum wie der
              aufrufende Prozess  erzeugt.  Dieser  Schalter  ist  für  die  Implementierung  von
              Containern gedacht.

              Ein  UTS-Namensraum  ist  eine  Zusammenstellung  von Bezeichnern, die von uname(2)
              zurückgegeben werden; von denen können der Domain-Name und  der  Rechnername  durch
              setdomainname(2) beziehungsweise sethostname(2) geändert werden. Änderungen, die an
              Bezeichnern in einem UTS-Namensraum  vorgenommen  werden,  sind  für  alle  anderen
              Prozesse  im  gleichen  Namensraum  sichtbar,  nicht jedoch für Prozesse in anderen
              UTS-Namensräumen.

              Nur ein privilegierter Prozess (CAP_SYS_ADMIN) kann CLONE_NEWUTS angeben.

              Weitere Informationen zu UTS-Namensräumen finden Sie in namespaces(7).

       CLONE_PARENT (seit Linux 2.3.12)
              Falls CLONE_PARENT gesetzt ist, dann wird der Elternprozess des neuen Kindprozesses
              (wie  er  von getppid(2) zurückgegeben wird) der gleiche wie der aufrufende Prozess
              sein.

              Falls CLONE_PARENT nicht gesetzt ist (wie bei fork(2)), dann ist der  Elternprozess
              des Kindprozesses der aufrufende Prozess.

              Beachten  Sie,  dass  dem  Elternprozess, wie er von getppid(2) zurückgegeben wird,
              signalisiert wird wenn der Kindprozess endet. Wenn also CLONE_PARENT  gesetzt  ist,
              wird  dem  Elternprozess  des aufrufenden Prozesses anstatt dem aufrufenden Prozess
              selbst das Signal gesandt.

       CLONE_PARENT_SETTID (seit Linux 2.5.49)
              Die Kindprozess-Thread-Kennung an der Stelle ptid im  Elternspeicher  ablegen.  (In
              Linux  2.5.32-2.5.48  gab  es  einen  Schalter  CLONE_SETTID,  der  das  tat.)  Die
              Speicheraktion wird abgeschlossen, bevor clone() die Steuerung an den  Benutzerraum
              zurückgibt.

       CLONE_PID (Linux 2.0 bis 2.5.15)
              Falls  CLONE_PID  gesetzt ist, wird der Kindprozess mit der gleichen Prozesskennung
              wie der aufrufende Prozess erstellt. Dies ist gut, um das System  zu  hacken,  aber
              andererseits  zu  nicht  viel  mehr  zu gebrauchen. Seit Linux 2.3.21 konnte dieser
              Schalter nur durch den Boot-Prozess  angegeben  werden  (PID  0).  Dieser  Schalter
              verschwand  in  Linux  2.5.16 komplett aus den Kernelquellen. Seitdem ignoriert der
              Kernel dieses Bit, falls es in flags festgelegt ist.

       CLONE_PIDFD (since Linux 5.2)
              If CLONE_PIDFD is set, clone()  stores a PID file descriptor referring to the child
              process  at the location ptid in the parent's memory. The close-on-exec flag is set
              on this new file descriptor. PID file descriptors can  be  used  for  the  purposes
              described in pidfd_open(2).

              Since  the  ptid  argument  is  used to return the PID file descriptor, CLONE_PIDFD
              cannot be used with CLONE_PARENT_SETTID.

              It is currently not possible to use this  flag  together  with  CLONE_THREAD.  This
              means  that  the  process  identified  by  the PID file descriptor will always be a
              thread-group leader.

              For a while there was a CLONE_DETACHED flag. This  flag  is  usually  ignored  when
              passed along with other flags. However, when passed alongside CLONE_PIDFD, an error
              is returned. This ensures that this  flag  can  be  reused  for  further  PID  file
              descriptor features in the future.

       CLONE_PTRACE (seit Linux 2.2)
              Falls  CLONE_PTRACE  angegeben  ist  und der aufrufende Prozess verfolgt wird, dann
              wird der Kindprozess ebenfalls verfolgt (siehe ptrace(2)).

       CLONE_SETTLS (seit Linux 2.5.32)
              Der TLS (Thread Local Storage)-Deskriptor ist auf newtls gesetzt.

              Die Interpretation von newtls und der resultierende Effekt ist architekturabhängig.
              Auf   X86   ist   newtls   als   ein   struct   user_desc *   interpretiert  (siehe
              set_thread_area(2)). Auf X86-64 ist es  der  neue  für  das  Basisregister  %fs  zu
              setzende Wert (siehe das Argument ARCH_SET_FS von arch_prctl(2)). Auf Architekturen
              mit einem dedizierten TLS-Register ist es der neue Wert dieses Registers.

       CLONE_SIGHAND (seit Linux 2.0)
              Ist CLONE_SIGHAND gesetzt, teilen sich der aufrufende Prozess und  der  Kindprozess
              die Tabelle der Signal-Handler. Ruft einer der beiden Prozesse sigaction(2) auf, um
              das Antwortverhalten auf ein Signal zu verändern, so betrifft dies auch den anderen
              Prozess. Jedoch besitzen aufrufender Prozess und Kindprozess nach wie vor getrennte
              Signalmasken und getrennte Listen der  noch  ausstehenden  Signale.  Daher  könnten
              Signale  durch Aufruf von sigprocmask(2) für einen Prozess geblockt oder zugelassen
              werden ohne den anderen Prozess zu beeinflussen.

              Ist CLONE_SIGHAND nicht gesetzt, erbt der Kindprozess durch den  clone-Aufruf  eine
              Kopie des Signal-Handlers vom aufrufenden Prozess. Spätere Aufrufe von sigaction(2)
              durch einen der Prozesse hat dann keine Auswirkung auf den anderen Prozess.

              Seit Linux 2.6.0 müssen die flags außerdem CLONE_VM enthalten, falls  CLONE_SIGHAND
              angegeben wurde.

       CLONE_STOPPED (seit Linux 2.6.0)
              Falls  CLONE_STOPPED  gesetzt ist, ist der Kindprozess anfangs gestoppt (als ob ein
              SIGSTOP-Signal gesendet worden wäre) und muss durch  Senden  eines  SIGCONT-Signals
              wieder aufgenommen werden.

              Dieser  Schalter  war  ab  Linux  2.6.25  missbilligt  und  wurde  in  Linux 2.6.38
              vollständig entfernt. Seitdem ignoriert der Kernel ihn ohne Fehler. Seit Linux  4.6
              wird dasselbe Bit für den Schalter CLONE_NEWCGROUP wiederverwendet.

       CLONE_SYSVSEM (seit Linux 2.5.10)
              Wenn CLONE_SYSVSEM gesetzt ist, dann teilen sich der Kindprozess und der aufrufende
              Prozess  eine  einzige  Liste   von   System-V-Semaphore-Anpassungswerten,   (siehe
              semop(2)).  In  diesem  Fall  sammelt  die  gemeinsame Liste semadj Werte über alle
              Prozesse, die die Liste  gemeinsam  nutzen  und  Semaphore-Anpassungen  werden  nur
              durchgeführt,  wenn der letzte Prozess, der die Liste gemeinsam nutzt, sich beendet
              (oder mittels unshare(2) aufhört, die Liste  mitzunutzen).  Falls  dieser  Schalter
              nicht  gesetzt ist, besitzt der Kindprozess eine separate semadj-Liste, die anfangs
              leer ist.

       CLONE_THREAD (seit Linux 2.4.0)
              Falls CLONE_THREAD gesetzt ist, wird der Kindprozess in die  gleiche  Thread-Gruppe
              wie  der  aufrufende Prozess platziert. Um den Rest der Diskussion von CLONE_THREAD
              leserlicher zu machen, wird der Begriff »Thread« benutzt,  um  Bezug  auf  Prozesse
              innerhalb einer Thread-Gruppe zu nehmen.

              Thread-Gruppen  waren  ein Leistungsmerkmal, das in Linux 2.4 hinzugefügt wurde, um
              den POSIX-Thread-Gedanken von einer Thread-Zusammenstellung  zu  unterstützen,  die
              sich  eine  einzelne  PID  teilt.  Intern  ist diese gemeinsame PID ein sogenannter
              Thread-Gruppen-Bezeichner (TGID)  für  die  Thread-Gruppe.  Seit  Linux  2.4  geben
              Aufrufe von getpid(2) die TGID des Aufrufers zurück.

              Die  Threads  innerhalb  einer  Gruppe  können durch ihre (systemweit) einheitliche
              Thread-Kennung (TID) unterschieden werden. Die TID  eines  neuen  Threads  ist  als
              Funktionsergebnis verfügbar, das an den Aufrufenden von clone() zurückgegeben wird.
              Ein Thread kann durch Benutzen von gettid(2) seine eigene TID erhalten.

              Wenn  clone()  ohne  Angabe  von  CLONE_THREAD  aufgerufen  wurde,  dann  wird  der
              resultierende  Thread  in eine neue Thread-Gruppe platziert, deren TGID der TID des
              Threads entspricht. Dieser Thread ist der Führer der neuen Thread-Gruppe.

              Ein neuer mit CLONE_THREAD erzeugter Thread hat den gleichen Elternprozess wie der,
              der  clone()  aufruft  (d.h.  wie CLONE_PARENT), so dass Aufrufe von getppid(2) den
              gleichen Wert für  alle  Threads  in  der  Thread-Gruppe  zurückliefern.  Wenn  ein
              CLONE_THREAD-Thread endet, wird dem Thread, der ihn per clone() erstellt hat, weder
              ein SIGCHLD-Signal (oder ein anderes Ende-Signal) gesandt,  noch  kann  der  Status
              eines  solchen Threads per wait(2) abgefragt werden. (Der Thread wird als losgelöst
              bezeichnet.)

              Nachdem alle Threads in einer Thread-Gruppe beendet sind,  wird  dem  Elternprozess
              ein SIGCHLD-Signal (oder ein anderes Ende-Signal) gesandt.

              Falls  einige  der  Threads  in einer Thread-Gruppe ein execve(2) durchführen, dann
              werden alle Threads außer dem Thread-Führer beendet und das neue Programm  wird  im
              Thread-Gruppenführer ausgeführt.

              Falls  einer  der  Threads  in  einer  Thread-Gruppe  per fork(2) einen Kindprozess
              erzeugt, dann kann jeder Thread  in  der  Gruppe  wait(2)  für  diesen  Kindprozess
              ausführen.

              Seit  Linux 2.5.35 müssen die flags auch CLONE_SIGHAND enthalten, wenn CLONE_THREAD
              angegeben wurde. Beachten Sie  auch,  dass  seit  Linux  2.6.0  CLONE_SIGHAND  auch
              CLONE_VM enthalten muss.

              Signalzuordnungen  und  -aktionen  sind  prozessweit:  Falls ein nicht abgefangenes
              Signal an  den  Thread  geschickt  wird,  dann  wird  es  alle  Mitglieder  in  der
              Thread-Gruppe beeinflussen (beenden, stoppen, fortfahren, darin ignoriert werden).

              Jeder Thread hat seine eigene Signalmaske, wie von sigprocmask(2) gesetzt.

              A  signal  may be process-directed or thread-directed. A process-directed signal is
              targeted at a thread group (i.e., a TGID),  and  is  delivered  to  an  arbitrarily
              selected  thread from among those that are not blocking the signal. A signal may be
              process-directed because it was generated by the kernel for reasons  other  than  a
              hardware  exception,  or  because  it  was  sent  using  kill(2)  or sigqueue(3). A
              thread-directed signal is targeted at (i.e., delivered to)  a  specific  thread.  A
              signal   may   be   thread  directed  because  it  was  sent  using  tgkill(2)   or
              pthread_sigqueue(3), or because the thread executed a machine language  instruction
              that triggered a hardware exception (e.g., invalid memory access triggering SIGSEGV
              or a floating-point exception triggering SIGFPE).

              Ein Aufruf von sigpending(2) liefert eine Signalmenge zurück, die  die  Vereinigung
              der   anhängigen   Prozess-orientierten  Signale  und  der  Signale,  die  für  den
              aufrufenden Thread anhängig sind, ist.

              Falls ein Prozess-orientiertes Signal an eine Thread-Gruppe ausgeliefert  wird  und
              die  Thread-Gruppe  einen Handler für dieses Signal installiert hat, dann dann wird
              der Handler in exakt einem  willkürlich  ausgewählten  Mitglied  der  Thread-Gruppe
              aufrufen, das das Signal nicht blockiert hat. Falls mehrere Threads in einer Gruppe
              darauf warten das gleiche Signal per sigwaitinfo(2) zu akzeptieren, wird der Kernel
              einen dieser Threads willkürlich auswählen, um das Signal zu empfangen.

       CLONE_UNTRACED (seit Linux 2.5.46)
              Falls CLONE_UNTRACED angegeben ist, kann ein verfolgender Prozess kein CLONE_PTRACE
              auf diesem Kindprozess erzwingen.

       CLONE_VFORK (seit Linux 2.2)
              Falls CLONE_VFORK gesetzt  ist,  wird  die  Ausführung  des  aufrufenden  Prozesses
              aufgeschoben bis der Kindprozess seine virtuellen Speicherressourcen durch Aufrufen
              von execve(2) oder _exit(2) (wie bei vfork(2)) freigibt.

              Falls CLONE_VFORK nicht gesetzt ist, dann werden sowohl der aufrufende Prozess, als
              auch  der  Kindprozess nach dem Aufruf planbar und eine Anwendung sollte sich nicht
              darauf verlassen, dass die Ausführung in einer speziellen Reihenfolge erfolgt.

       CLONE_VM (seit Linux 2.0)
              Ist  CLONE_VM  gesetzt,  laufen  aufrufender  Prozess  und  Kindprozess  im  selben
              Speicherbereich.  Insbesondere  sind Schreibzugriffe des aufrufenden Prozesses oder
              des Kindprozesses  in  den  gemeinsamen  Speicher  auch  vom  anderen  Prozess  aus
              sichtbar. Zudem beeinflusst jede Veränderung der Speicher-Mappings mit mmap(2) oder
              munmap(2) durch den Kindprozess oder  den  aufrufenden  Prozess  auch  den  jeweils
              anderen Prozess.

              Ist   CLONE_VM  nicht  gesetzt,  erhält  der  Kindprozess  eine  eigene  Kopie  des
              Speicherbereichs des aufrufenden Prozesses zur Zeit des clone()-Aufrufs. Führt  ein
              Prozess  Schreibzugriffe  auf den Speicher oder Änderungen am Dateispeicher-Mapping
              aus, beeinflussen diese Operationen nicht den jeweils anderen, wie bei fork(2).

ANMERKUNGEN

       Beachten Sie, dass die Glibc-Wrapperfunktion clone() einige Änderungen  am  Speicher,  auf
       den   child_stack  zeigt,  vornimmt  (Änderungen,  um  den  Stack  korrekt  für  das  Kind
       einzurichten), bevor der Systemaufruf clone()  ausgelöst  wird.  Verwenden  Sie  daher  in
       Fällen,  in  denen  clone() zur rekursiven Erstellung von Kindern verwandt wird, nicht den
       Puffer, der für den Stack der Eltern eingesetzt wird, als Stack der Kinder.

   Unterschiede C-Bibliothek/Kernel
       Der rohe sys_clone-Systemaufruf entspricht eher fork(2), da  er  mit  der  Ausführung  des
       Kindprozesses  am  Zeitpunkt  des Aufrufs fortfährt. Von daher werden die Argumente fn und
       arg der clone()-Wrapper-Funktion weggelassen.

       Ein weiterer Unterschied für den  rohen  Systemaufruf  clone()  besteht  darin,  dass  das
       Argument  child_stack  NULL sein könnte, so dass in diesem Fall das Kind eine Dublette des
       Stacks des Elternprozesses verwendet. (»Copy-on-write«-Semantik stellt  sicher,  dass  der
       Kindprozess  getrennte  Kopien  des Stapelspeichers erhält, wenn einer der beiden Prozesse
       den Stapelspeicher verändert.) In diesem Fall sollte die Option CLONE_VM  nicht  angegeben
       werden,  damit  es  korrekt  funktioniert.  (Falls  das  Kind  sich aufgrund des Schalters
       CLONE_VM   mit   dem   Elternprozess   den    Speicher    teilt,    dann    tritt    keine
       copy-on-write-Duplizierung auf und wahrscheinlich tritt Chaos ein.

       Die  Reihenfolge  der  Argumente unterscheidet sich auch im rohen Systemaufruf und es gibt
       über die Architekturen hinweg Variationen in den Argumenten, wie  dies  in  den  folgenden
       Absätzen dargestellt wird.

       Die  rohe  Schnittstelle  für  Systemaufrufe  auf x86-64 und einigen anderen Architekturen
       (darunter Sh, Tile, Ia-64 und Alpha) sieht so aus:

           long clone(unsigned long flags, void *child_stack,
                      int *ptid, int *ctid,
                      unsigned long newtls);

       Auf x86-32 und mehreren anderen häufigen  Architekturen  (darunter  Score,  ARM,  ARM  64,
       PA-RISC,  Arc,  Power  PC, Xtensa und MIPS) ist die Reihenfolge der letzten zwei Argumente
       gedreht:

           long clone(unsigned long flags, void *child_stack,
                     int *ptid, unsigned long newtls,
                     int *ctid);

       Auf der Cris- und S30-Architektur ist die Reihenfolge der ersten zwei Argumente gedreht:

           long clone(void *child_stack, unsigned long flags,
                      int *ptid, int *ctid,
                      unsigned long newtls);

       Auf der Microblaze-Architektur wird ein zusätzliches Argument übergeben:

           long clone(unsigned long flags, void *child_stack,
                      int stack_size,         /* Größe des Stacks */
                      int *ptid, int *ctid,
                      unsigned long newtls);

   Blackfin, M68k und Sparc
       Die Konventionen der Argumentübergabe weichen auf Blackfin, M68k und Sparc von der  obigen
       Beschreibung ab. Einzelheiten finden Sie in der Kernel- (und Glibc-) Quelle.

   Ia64
       Auf ia64 wird eine andere Schnittstelle benutzt:

           int __clone2(int (*fn)(void *),
                        void *child_stack_base, size_t stack_size,
                        int flags, void *arg, 
                     /* pid_t *ptid, struct user_desc *tls,
                        pid_t *ctid */ );

       Der oben gezeigte Prototyp ist für die Glibc-Wrapper-Funktion; für den Systemaufruf selbst
       wird der Prototyp wie  folgt  beschrieben  (er  ist  identisch  zum  clone()-Prototyp  auf
       Microblaze):

           long clone2(unsigned long flags, void *child_stack_base,
                       int stack_size,         /* Größe des Stacks */
                       int *ptid, int *ctid,
                       unsigned long tls);

       __clone2() arbeitet auf die gleiche Weise wie clone(), außer dass child_stack_base auf die
       niedrigste Adresse im Stapelspeicherbereich des Kindprozesses  zeigt  und  stack_size  die
       Größe des Stapelspeichers angibt, auf die child_stack_base zeigt.

   Linux 2.4 und älter
       Unter Linux 2.4 und früher gab es die Argumente ptid, tls und ctid noch nicht.

RÜCKGABEWERT

       Bei   Erfolg   wird   im  ausgeführten  Thread  des  Aufrufenden  die  Thread-Kennung  des
       Kindprozesses  zurückgegeben.  Im  Fehlerfall  wird  im   Kontext   des   Aufrufenden   -1
       zurückgegeben, kein Kindprozess erzeugt und errno entsprechend gesetzt.

FEHLER

       EAGAIN Es laufen bereits zu viele Prozesse; siehe fork(2).

       EINVAL CLONE_SIGHAND wurde angegeben, aber nicht CLONE_VM. (Seit Linux 2.6.0.)

       EINVAL CLONE_THREAD wurde angegeben, aber nicht CLONE_SIGHAND. (Seit Linux 2.5.35.)

       EINVAL CLONE_THREAD  wurde  festgelegt,  aber der aktuelle Prozess hatte vorher unshare(2)
              mit dem Schalter CLONE_NEWPID aufgerufen oder setns(2)  verwandt,  um  sich  wieder
              einem PID-Namensraum zuzuordnen.

       EINVAL In flags wurden sowohl CLONE_FS als auch CLONE_NEWNS angegeben.

       EINVAL (seit Linux 3.9)
              In flags wurden sowohl CLONE_NEWUSER als auch CLONE_FS angegeben.

       EINVAL In flags wurden sowohl CLONE_NEWIPC als auch CLONE_SYSVSEM angegeben.

       EINVAL Eines (oder beides) von CLONE_NEWPID oder CLONE_NEWUSER und eines (oder beides) von
              CLONE_THREAD oder CLONE_PARENT wurde in flags angegeben.

       EINVAL Wird von der Glibc-Wrapper-Funktion clone() zurückgegeben, wenn ein Wert  von  Null
              für fn oder child_stack angegeben wurde.

       EINVAL CLONE_NEWIPC  wurde in flags festgelegt, aber der Kernel ist nicht mit den Optionen
              CONFIG_SYSVIPC und CONFIG_IPC_NS konfiguriert.

       EINVAL CLONE_NEWNET wurde in flags festgelegt, aber der Kernel ist nicht  mit  der  Option
              CONFIG_NET_NS konfiguriert.

       EINVAL CLONE_NEWPID  wurde  in  flags  angegeben, aber der Kernel ist nicht mit der Option
              CONFIG_PID_NS konfiguriert.

       EINVAL CLONE_NEWUSER wurde in flags festgelegt, aber der Kernel ist nicht mit  der  Option
              CONFIG_USER_NS konfiguriert.

       EINVAL CLONE_NEWUTS  wurde  in  flags festgelegt, aber der Kernel ist nicht mit der Option
              CONFIG_UTS_NS konfiguriert.

       EINVAL child_stack  ist  nicht  an  einer  geeigneten   Grenze   für   diese   Architektur
              ausgerichtet.  Beispielsweise  muss  child_stack  auf Aarch64 ein Vielfaches von 16
              sein.

       EINVAL CLONE_PIDFD was specified together with CLONE_DETACHED.

       EINVAL CLONE_PIDFD was specified together with CLONE_PARENT_SETTID.

       EINVAL CLONE_PIDFD was specified together with CLONE_THREAD.

       ENOMEM Es kann nicht ausreichend Speicher  für  eine  Aufgabenstruktur  des  Kindprozesses
              reserviert werden oder um benötigte Teile vom Kontext des Aufrufenden zu kopieren.

       ENOSPC (seit Linux 3.7)
              CLONE_NEWPID   wurde   in   den   Schalter   angegeben,  aber  die  Begrenzung  der
              Verschachtelungstiefe   von    PID-Namensräumen    würde    überschritten;    siehe
              pid_namespaces(7).

       ENOSPC (seit Linux 4.9; vorher EUSERS)
              CLONE_NEWUSER   wurde   in   flags   festgelegt  und  der  Aufruf  würde  zu  einer
              Überschreitung   der   Begrenzung    für    die    Anzahl    von    verschachtelten
              Benutzernamensräumen führen. Siehe user_namespaces(7).

              Von Linux 3.11 bis Linux 4.8 war der in diesem Fall diagnostizierte Fehler EUSERS.

       ENOSPC (seit Linux 4.9)
              Einer  der  Werte  in  flags  legte die Erstellung eines neuen Benutzer-Namensraums
              fest, dadurch  würde  aber  die  in  der  enstprechenden  Datei  in  /proc/sys/user
              festgelegte Begrenzung überschritten. Für weitere Details siehe namespaces(7).

       EPERM  CLONE_NEWCGROUP,   CLONE_NEWIPC,   CLONE_NEWNET,   CLONE_NEWNS,  CLONE_NEWPID  oder
              CLONE_NEWUTS wurde von einem nicht privilegierten Prozess angegeben  (Prozess  ohne
              CAP_SYS_ADMIN).

       EPERM  CLONE_PID  wurde  von einem anderen Prozess als Prozess 0 angegeben. (Dieser Fehler
              tritt nur unter Linux 2.5.15 und früheren Versionen auf.)

       EPERM  CLONE_NEWUSER wurde in flags festgelegt, aber weder die  effektive  Benutzerkennung
              noch  die  effektive  Gruppenkennung  des  Aufrufenden  hat  eine  Abbildung in den
              Namensraum der Eltern (siehe user_namespaces(7)).

       EPERM (seit Linux 3.9)
              CLONE_NEWUSER  wurde  in  flags  festgelegt  und  der  Aufrufende  ist   in   einer
              Chroot-Umgebung  (d.h.  das  Wurzelverzeichnis  des  Aufrufenden  passt  nicht  zum
              Wurzelverzeichnis des Einhängenamensraums, in dem er sich befindet).

       ERESTARTNOINTR (seit Linux 2.6.17)
              Ein Systemaufruf wurde durch ein Signal unterbrochen und wird neu gestartet.  (Dies
              wird nur während einer Verfolgung sichtbar sein.)

       EUSERS (Linux 3.11 bis Linux 4.8)
              CLONE_NEWUSER  wurde  in  flags  festgelegt  und  die Begrenzung für die Anzahl von
              verschachtelten Benutzernamensräumen würde überschritten. Siehe die Diskussion  des
              Fehlers ENOSPC oben.

KONFORM ZU

       clone() ist Linux-spezifisch und sollte nicht in portierbaren Programmen benutzt werden.

ANMERKUNGEN

       Der  Systemaufruf  kcmp(2) kann zum Testen, ob zwei Prozesse sich verschiedene Ressourcen,
       wie die Dateideskriptortabelle, die Rücksetz-Aktionen der System-V-Semaphoren  oder  einen
       virtuellen Adressraum, teilen, verwandt werden.

       Handler,  die mittels pthread_atfork(3) registriert sind, werden während eines Aufrufs von
       clone() nicht ausgeführt.

       In der Linux 2.4.x-Serie gibt CLONE_THREAD generell dem neuen Prozess nicht  den  gleichen
       Elternprozess,  wie  dem  aufrufenden  Prozess.  Für die Kernel-Versionen 2.4.7 bis 2.4.18
       implizierte der Schalter CLONE_THREAD jedoch den  Schalter  CLONE_PARENT  (wie  in  Kernel
       2.6.0 und neuer).

       Für  eine  Weile  gab es CLONE_DETACHED (eingeführt in 2.5.32): Elternprozesse wollen kein
       Ende-Signal des Kindprozesses. In Linux 2.6.2 verschwand die Notwendigkeit, dies  zusammen
       mit  CLONE_THREAD  zu  übergeben. Dieser Schalter ist immer noch definiert, hat aber keine
       Auswirkungen.

       Auf i386-Architekturen sollte clone() nicht  durch  vsyscall  aufgerufen  werden,  sondern
       direkt durch int $0x80.

FEHLER

       GNU-C-Bibliotheksversionen  2.3.4 bis einschließlich 2.24 enthielten eine Wrapper-Funktion
       für getpid(2), die Zwischenspeichern von PIDs vornahm.  Dieses  Zwischenspeichern  beruhte
       auf  der  Unterstützung  in  dem  Glibc-Wrapper  von  clone(), aber Einschränkungen in der
       Implementierung bedeuteten,  dass  unter  einigen  Umständen  der  Zwischenspeicher  nicht
       aktuell  war.  Insbesondere  wenn  ein  Signal  sofort  nach  dem  clone()-Aufruf  an  den
       Kindprozess gesandt wurde, konnte ein Aufruf von getpid(2) in einem Signal-Handler die PID
       des  aufrufenden  Prozesses  (des  »Elternprozesses«) zurückgeben, falls der Clone-Wrapper
       noch keine Chance hatte den PID-Zwischenspeicher im Kindprozess zu  aktualisieren.  (Diese
       Diskussion  ignoriert  den  Fall, dass der Kindprozess mit CLONE_THREAD erstellt wurde, in
       dem getpid(2) den gleichen Wert im Kindprozess zurückgeben  sollte  und  im  Prozess,  der
       clone() aufrief, wie sich der Aufrufende und der Kindprozess in der gleichen Thread-Gruppe
       befinden. Das Problem des nicht mehr frischen Zwischenspeichers tritt auch auf,  wenn  das
       Argument  flags  CLONE_VM enthält.) Um die Wahrheit zu erfahren, war es manchmal notwendig
       gewesen, Code wie den folgenden zu verwenden:

           #include <syscall.h>

           pid_t mypid;

           mypid = syscall(SYS_getpid);

       Aufgrund des Problems mit dem  nicht  mehr  frischem  Zwischenspeicher  sowie  anderen  in
       getpid(2)  bemerkten  Problemen,  wurde  die  Funktionalität des PID-Zwischenspeicherns in
       Glibc 2.25 entfernt.

BEISPIEL

       Das  folgende  Programm  demonstriert  die  Benutzung  von  clone()  zum  Erzeugen   eines
       Kindprozesses,  der  in  einem  separaten  UTS-Namensraum ausgeführt wird. Der Kindprozess
       ändert in seinem UTS-Namensraum den Rechnernamen. Dann  zeigen  sowohl  Eltern-  als  auch
       Kindprozess  den  Rechnernamen des Systems an, wodurch sichtbar wird, dass der Rechnername
       sich im UTS-Namensraum von Eltern- und Kindprozess unterscheidet.  Ein  Beispiel  für  die
       Verwendung dieses Programms finden Sie in setns(2).

   Programmquelltext
       #define _GNU_SOURCE
       #include <sys/wait.h>
       #include <sys/utsname.h>
       #include <sched.h>
       #include <string.h>
       #include <stdio.h>
       #include <stdlib.h>
       #include <unistd.h>

       #define errExit(Nachricht)    do { perror(Nachricht); exit(EXIT_FAILURE); \
                               } while (0)

       static int              /* Startfunktion für geklonten Kindprozess */
       childFunc(void *arg)
       {
           struct utsname uts;

           /* Rechnername im UTS-Namensraum des Kindprozesses ändern */

           if (sethostname(arg, strlen(arg)) == -1)
               errExit("sethostname");

           /* Rechnernamen abfragen und anzeigen */

           if (uname(&uts) == -1)
               errExit("uname");
           printf("uts.nodename im Kindprozess:  %s\n", uts.nodename);

           /* Der Namensraum wird für eine Weile durch Schlafen offen gehalten.
              Dies ermöglicht etwas zu experimentieren –  zum Beispiel
              kann ein weiterer Prozess dem Namensraum beitreten. */

           sleep(200);

           return 0;           /* Kindprozess wird nun beendet */
       }

       #define STACK_SIZE (1024 * 1024)    /* Stapelspeichergröße für geklonten
                                              Kindprozess */

       int
       main(int argc, char *argv[])
       {
           char *stack;                    /* Start des Stapelspeicherpuffers */
           char *stackTop;                 /* Ende des Stapelspeicherpuffers */
           pid_t pid;
           struct utsname uts;

           if (argc < 2) {
               fprintf(stderr, "Aufruf: %s <Kindprozess-Rechnername>\n", argv[0]);
               exit(EXIT_SUCCESS);
           }

           /* Stapelspeicher für Kindprozess reservieren */

           stack = malloc(STACK_SIZE);
           if (stack == NULL)
               errExit("malloc");
           stackTop = stack + STACK_SIZE;  /* Annahme, dass Stapelspeicher nach
                                              unten wächst */

           /* Es wird ein Kindprozess erzeugt, der seinen eigenen Namensraum hat.
              Der Kindprozess beginnt die Ausführung in childFunc() */

           pid = clone(childFunc, stackTop, CLONE_NEWUTS | SIGCHLD, argv[1]);
           if (pid == -1)
               errExit("clone");
           printf("clone() gab %ld zurück\n", (long) pid);

           /* Elternprozess fällt bis hierher durch */

           sleep(1);   /* gibt dem Kindprozess Zeit zum Ändern des Rechnernamens */

           /* Den Rechnernamen im UTS-Namensraum des Elternprozesses anzeigen.
              Dieser wird sich vom Rechnernamen im UTS-Namensraum des Kindprozesses
              unterscheiden. */

           if (uname(&uts) == -1)
               errExit("uname");
           printf("uts.nodename im Elternprozess: %s\n", uts.nodename);

           if (waitpid(pid, NULL, 0) == -1)    /* Warten auf Kindprozess */
               errExit("waitpid");
           printf("Kindprozess wurde beendet\n");

           exit(EXIT_SUCCESS);
       }

SIEHE AUCH

       fork(2),  futex(2),  getpid(2),  gettid(2),  kcmp(2),  pidfd_open(2),  set_thread_area(2),
       set_tid_address(2),   setns(2),   tkill(2),    unshare(2),    wait(2),    capabilities(7),
       namespaces(7), pthreads(7)

KOLOPHON

       Diese  Seite  ist  Teil  der  Veröffentlichung  5.03  des  Projekts  Linux-man-pages. Eine
       Beschreibung des Projekts, Informationen, wie Fehler  gemeldet  werden  können  sowie  die
       aktuelle Version dieser Seite finden sich unter https://www.kernel.org/doc/man-pages/.

ÜBERSETZUNG

       Die  deutsche  Übersetzung dieser Handbuchseite wurde von Daniel Kobras <kobras@linux.de>,
       Chris Leick <c.leick@vollbio.de>, Mario  Blättermann  <mario.blaettermann@gmail.com>,  Dr.
       Tobias Quathamer <toddy@debian.org> und Helge Kreutzmann <debian@helgefjell.de> erstellt.

       Diese  Übersetzung  ist  Freie  Dokumentation;  lesen  Sie  die GNU General Public License
       Version  3  oder  neuer  bezüglich  der  Copyright-Bedingungen.  Es  wird  KEINE   HAFTUNG
       übernommen.

       Wenn Sie Fehler in der Übersetzung dieser Handbuchseite finden, schicken Sie bitte eine E-
       Mail an <debian-l10n-german@lists.debian.org>.