Provided by: manpages-de-dev_1.4-1_all bug

BEZEICHNUNG

       fork - erzeugt einen Kindprozess

ÜBERSICHT

       #include <unistd.h>

       pid_t fork(void);

BESCHREIBUNG

       fork() erzeugt einen neuen Prozess, indem der aufrufende Prozess dupliziert wird. Der neue
       Prozess wird als das Kind bezeichnet. Er ist bis auf  die  folgenden  Punkte  eine  exakte
       Kopie des aufrufenden Prozesses (Parent):

       *  Das  Kind  hat  seine  eigene  eindeutige  Prozess-ID,  die  mit  keiner ID irgendeiner
          existierenden Prozessgruppe übereinstimmt (setpgid(2)).

       *  Die  Parent-Prozess-ID  des  Kindes  ist   die   gleiche   wie   die   Prozess-ID   des
          Parent-Prozesses.

       *  Das Kind erbt keine Speichersperren des Parent-Prozesses (mlock(2), mlockall(2)).

       *  Für  das  Kind  wird  die  Nutzung  von Prozessressourcen (getrusage(2)) und Zähler für
          CPU-Zeiten (times(2)) auf null zurückgesetzt.

       *  Der Satz für das Kind anstehender Signale ist anfangs leer (sigpending(2)).

       *  Das Kind erbt keine Semaphor-Einstellungen von seinem Parent (semop(2)).

       *  Das Kind erbt keine Datensatzsperren von seinem Parent (fcntl(2)).

       *  Das Kind erbt keine Timer von seinem Parent (setitimer(2), alarm(2), timer_create(2)).

       *  Das  Kind  erbt  keine  ausstehenden  asynchronen  E/A-Operationen  von  seinem  Parent
          (aio_read(3),  aio_write(3)),  auch  asynchrone  E/A-Kontexte  des Parents werden nicht
          vererbt (siehe io_setup(2)).

       Die  Prozessattribute  in  der  vorstehenden  Liste  werden   allesamt   in   POSIX.1-2001
       beschrieben.  Parent  und Kind unterscheiden sich auch in den folgenden Linux-spezifischen
       Prozessattributen:

       *  Das  Kind  erbt  keine  Nachrichten  über   Verzeichnisänderungen   (directory   change
          notifications,  dnotify)  von  seinem  Parent  (siehe  die Beschreibung von F_NOTIFY in
          fcntl(2)).

       *  Die Einstellung PR_SET_PDEATHSIG von prctl(2) wird zurückgesetzt, sodass das Kind  kein
          Signal empfängt, wenn sein Parent terminiert.

       *  Der voreingestellte Wert für den Timer-Spielraum (»timer slack«) wird auf den aktuellen
          Timer-Spielraum des Parents gesetzt. Siehe die Beschreibung  von  PR_SET_TIMERSLACK  in
          prctl(2).

       *  Speicherabbildungen,  die mit dem madvise(2)-Flag MADV_DONTFORK markiert wurden, werden
          nicht über einen Aufruf von fork() hinweg vererbt.

       *  Das Terminierungssignal des Kindes ist immer SIGCHLD (siehe clone(2)).

       *  Die von ioperm(2) gesetzten Bits für Portzugriffe werden nicht  an  das  Kind  vererbt,
          stattdessen muss das Kind benötigte Bits mittels ioperm(2) aktivieren.

       Beachten Sie die folgenden weiteren Punkte:

       *  Der Kindprozess wird mit einem einzigen Thread erstellt — demjenigen, der fork aufrief.
          Der gesamte virtuelle Adressraum des Parents wird im  Kind  repliziert,  einschließlich
          der  Zustände  der  Mutexe,  von Zustandsvariablen und anderer »pthread«- Objekten; die
          Verwendung von pthread_atfork(3) kann hilfreich sein für  die  Behandlung  von  dadurch
          verursachten Problemen.

       *  Das  Kind erbt Kopien des Parent-Satzes von offenen Dateideskriptoren. Jeder Deskriptor
          des Kindes bezieht sich auf die gleiche  Beschreibung  einer  geöffneten  Datei  (siehe
          open(2))  wie  der  entsprechende  Dateideskriptor  im  Parent. Dies bedeutet, dass die
          beiden Deskriptoren die Status-Flags geöffneter Dateien, den aktuellen Datei-Offset und
          signalgesteuerte  E/A-Attribute  (siehe  die  Beschreibung von F_SETOWN und F_SETSIG in
          fcntl(2)) gemeinsam nutzen.

       *  Das Kind erbt Kopien des Parent-Deskriptorsatzes für offene Nachrichten-Warteschlangen.
          Jeder  Deskriptor des Kindes bezieht sich auf die gleiche Beschreibung einer geöffneten
          Nachrichten-Warteschlange (siehe mq_overview(7)) wie der  entsprechende  Deskriptor  im
          Parent.  Das  bedeutet,  dass  die  beiden  Deskriptoren  die gleichen Flags (mq_flags)
          gemeinsam nutzen.

       *  Das  Kind  erbt  Kopien  des  Parent-Satzes  für  offene   Verzeichnis-Streams   (siehe
          opendir(3)).  POSIX.1-2001  besagt, dass die entsprechenden Verzeichnis-Streams auf die
          gleiche Position zeigen können; unter Linux/Glibc tun sie es nicht.

RÜCKGABEWERT

       Bei Erfolg wird dem Parent die PID des Kindprozesses zurückgegeben und dem Kind  0  .  Bei
       Fehlern  wird dem Parent -1 zurückgegeben, kein Kindprozess erzeugt und errno entsprechend
       gesetzt.

FEHLER

       EAGAIN fork() kann nicht ausreichend Speicher allozieren, um die Page Tables  des  Parents
              zu kopieren und einen Task-Record für den Kindprozess anzulegen.

       EAGAIN Es    war    nicht   möglich   einen   neuen   Prozess   zu   erstellen,   da   die
              Ressourcen-Beschränkung   RLIMIT_NPROC  des  aufrufenden  Prozesses   überschritten
              wurde.  Um  diesen  Wert  zu vergrößern, muss der Prozess über eine der Capabilitys
              CAP_SYS_ADMIN oder CAP_SYS_RESOURCE verfügen.

       ENOMEM fork() konnte wegen Speicherknappheit die  erforderlichen  Kernel-Strukturen  nicht
              anlegen.

       ENOSYS fork()  wird  auf  dieser Plattform nicht unterstützt (beispielsweise Hardware ohne
              eine Memory-Management Unit).

KONFORM ZU

       SVr4, 4.3BSD, POSIX.1-2001.

ANMERKUNGEN

       Unter Linux ist fork() mittels »copy-on-write«-Seiten implementiert,  sodass  der  einzige
       Nachteil  von  fork() die Zeit und der Speicher ist, der benötigt wird, um die Page Tables
       des Parents zu kopieren und eine eindeutige Task-Struktur für das Kind anzulegen.

       Der  Glibc-Wrapper  für  fork()   wird   als   Teil   der   NPTL-Threading-Implementierung
       bereitgestellt.  Seit  Version  2.3.3  der  Glibc  ruft  der fork()-Wrapper nicht mehr den
       Kernel-Systemaufruf fork() auf, sondern clone(2) mit Flags, die das Gleiche  bewirken  wie
       der  traditionelle  Systemaufruf.  (Ein  Aufruf  von  fork() ist gleichbedeutend mit einem
       Aufruf von clone(2), bei dem für flags nur SIGCHLD angegeben wird.) Der Glibc-Wrapper ruft
       alle Fork-Handler auf, die mittels pthread_atfork(3) eingerichtet wurden.

BEISPIEL

       Siehe pipe(2) und wait(2).

SIEHE AUCH

       clone(2),  execve(2),  exit(2),  setrlimit(2),  unshare(2),  vfork(2), wait(2), daemon(3),
       capabilities(7), credentials(7)

KOLOPHON

       This page is part of release 3.54 of the Linux man-pages project.  A  description  of  the
       project,     and    information    about    reporting    bugs,    can    be    found    at
       http://www.kernel.org/doc/man-pages/.

ÜBERSETZUNG

       Die   deutsche   Übersetzung   dieser   Handbuchseite    wurde    von    Martin    Schulze
       <joey@infodrom.org>,   Martin   Eberhard   Schauer   <Martin.E.Schauer@gmx.de>  und  Mario
       Blättermann <mario.blaettermann@gmail.com> 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>.