Provided by: manpages-de-dev_1.11-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):

       Der Kindprozess und der Elternprozess laufen in separaten Speicherbereichen. Zum Zeitpunkt
       von fork() haben beide  Speicherbereiche  den  gleichen  Inhalt.  Speicherschreibvorgänge,
       Dateizuordnungen  (mmap(2))  und  die  Lösung  von Zuordnungen (munmap(2)) eines Prozesses
       beeinflussen den jeweiligen anderen Prozess nicht.

       Der Kindprozess ist ein exaktes Duplikat des Elternprozesses, mit folgenden Ausnahmen:

       *  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)).

       *  The  child does not inherit process-associated record locks from its parent (fcntl(2)).
          (On the other hand, it does inherit fcntl(2)  open file description locks and  flock(2)
          locks from its parent.)

       *  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 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.

       *  After  a  fork(2)   in  a  multithreaded  program,  the  child  can  safely  call  only
          async-signal-safe functions (see signal(7))  until such time as it calls execve(2).

       *  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  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

              A system-imposed limit on the number of threads was encountered. There are a number
              of  limits  that  may trigger this error: the RLIMIT_NPROC soft resource limit (set
              via setrlimit(2)), which limits the number of processes and threads for a real user
              ID,  was  reached;  the  kernel's  system-wide limit on the number of processes and
              threads, /proc/sys/kernel/threads-max, was reached (see proc(5));  or  the  maximum
              number of PIDs, /proc/sys/kernel/pid_max, was reached (see proc(5)).

       EAGAIN The  caller  is  operating  under the SCHED_DEADLINE scheduling policy and does not
              have the reset-on-fork flag set. See sched(7).

       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

       POSIX.1-2001, POSIX.1-2008, SVr4, 4.3BSD.

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.

   Unterschiede C-Bibliothek/Kernel
       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

       Diese Seite  ist  Teil  der  Veröffentlichung  4.04  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 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>.