fork, f_fork, oder vfork Unterprogramm

Zweck

Erstellt einen neuen Prozess.

Bibliotheken

fork, f_forkund vfork: Standard C Library (libc.a)

Syntax

#include <unistd.h>
pid_t fork(void)
pid_t f_fork(void)
int vfork(void)

Beschreibung

Das Unterprogramm fork erzeugt einen neuen Prozess. Der neue Prozess (untergeordneter Prozess) ist eine fast exakte Kopie des aufrufenden Prozesses (übergeordneter Prozess). Der untergeordnete Prozess übernimmt die folgenden Attribute vom übergeordneten Prozess:

  • -Umgebung
  • Close-on-exec-Flags (beschrieben im Unterprogramm exec )
  • Einstellungen für die Signalverarbeitung (wie der SIG_DFL-Wert, der SIG_IGN-Wert und der Funktionsadressparameter )
  • Benutzer-ID-Modus-Bit setzen
  • Gruppen-ID-Modus-Bit setzen
  • Status der Profilerstellung ein und aus
  • Schöner Wert
  • Alle angehängten gemeinsamen Bibliotheken
  • Prozessgruppen-ID
  • tty group ID (beschrieben in den Unterprogrammen exit, atexit oder _exit, signal und raise )
  • Aktuelles Verzeichnis
  • Stammverzeichnis
  • Erstellungsmaske für den Dateimodus (beschrieben in der Unterroutine umask )
  • Begrenzung der Dateigröße (beschrieben in der Unterroutine ulimit )
  • Angeschlossene gemeinsame Speichersegmente (beschrieben im Unterprogramm shmat )
  • Angehängte gemappte Dateisegmente (beschrieben in der Unterroutine shmat )
  • Prozess-ID des Debuggers und Multiprozess-Flag, wenn der übergeordnete Prozess das Multiprozess-Debugging aktiviert hat (beschrieben in der Unterroutine ptrace ).

Der untergeordnete Prozess unterscheidet sich wie folgt vom übergeordneten Prozess:

  • Der Kindprozess hat nur einen Benutzer-Thread; es ist derjenige, der das Fork-Unterprogramm aufgerufen hat.
  • Der untergeordnete Prozess hat eine eindeutige Prozess-ID.
  • Die ID des Kindprozesses stimmt mit keiner aktiven Prozessgruppen-ID überein.
  • Der untergeordnete Prozess hat eine andere übergeordnete Prozess-ID.
  • Der Kindprozess hat seine eigene Kopie der Dateideskriptoren des Elternprozesses. Jeder Dateideskriptor des untergeordneten Prozesses nutzt jedoch einen gemeinsamen Dateizeiger mit dem entsprechenden Dateideskriptor des übergeordneten Prozesses.
  • Alle semadj-Werte werden gelöscht. Informationen über semadj-Werte finden Sie in der Unterroutine semop.
  • Prozesssperren, Textsperren und Datensperren werden nicht an den Kindprozess vererbt. Informationen über Sperren finden Sie in der Unterroutine plock.
  • Wenn das Multiprozess-Debugging eingeschaltet ist, werden die Trace-Flags vom übergeordneten Prozess geerbt; andernfalls werden die Trace-Flags zurückgesetzt. Informationen zur Anfrage 0 finden Sie in der Unterroutine ptrace.
  • Die Subroutinen utime, stime, cutime und cstime des Kindprozesses werden auf 0 gesetzt. (Weitere Informationen finden Sie in den Unterprogrammen getrusage, times und vtimes )
  • Alle anstehenden Alarme werden im untergeordneten Prozess gelöscht. (Weitere Informationen finden Sie in den Unterprogrammen incinterval, setitimer und alarm )
  • Die Menge der für den Kindprozess anstehenden Signale wird mit einer leeren Menge initialisiert.
  • Der untergeordnete Prozess kann seine eigene Kopie des Nachrichtenkatalogs für den übergeordneten Prozess haben.
Achtung! Wenn Sie die Unterroutinen fork oder vfork mit einer X Window System-, X Toolkit- oder Motif-Anwendung verwenden, öffnen Sie eine separate Display-Verbindung (Socket) für den geforkten Prozess. Wenn der untergeordnete Prozess die gleiche Anzeigeverbindung wie der übergeordnete Prozess verwendet, kann der X-Server die resultierenden Daten nicht interpretieren.

Die Subroutine f_Verzweigung ähnelt Verzweigung, mit Ausnahme der folgenden:

  • Es ist erforderlich, dass der untergeordnete Prozess unmittelbar nach seiner Erstellung eine der Exec -Funktionen aufruft. Da die Fork-Handler nie aufgerufen werden, sind die Anwendungsdaten, Mutexe und die Sperren im Kindprozess undefiniert.

Das Unterprogramm vfork wird als Kompatibilitätsschnittstelle für ältere Systemprogramme der Berkeley Software Distribution (BSD) unterstützt und kann durch Kompilieren mit der Berkeley Compatibility Librarylibbsd.a) verwendet werden.

In der Version 4 des Betriebssystems muss der Elternprozess nicht warten, bis der Kindprozess entweder beendet oder ausgeführt wird, wie es in BSD-Systemen der Fall ist. Der Kindprozess erhält einen neuen Adressraum, wie im Unterprogramm fork. Der Kindprozess teilt sich keinen übergeordneten Adressraum.

Achtung! Wenn Sie die Unterroutinen fork oder vfork mit einer Enhanced X-Windows-, X-Toolkit- oder Motif-Anwendung verwenden, sollte für den geforkten Prozess eine separate Display-Verbindung (Socket) geöffnet werden. Der untergeordnete Prozess sollte niemals dieselbe Anzeigeverbindung wie der übergeordnete Prozess verwenden. Anzeigeverbindungen werden mit Sockets verkörpert und Sockets werden vom untergeordneten Prozess übernommen. Jeder Versuch, mehrere Prozesse in dieselbe Anzeigeverbindung zu schreiben, führt dazu, dass X Protokollpakete auf Wortebene zufällig verzahnt werden. Die resultierenden Daten, die in das Socket geschrieben werden, sind keine gültigen oder nicht definierten X-Protokoll-Pakete und der X-Server kann sie nicht interpretieren.
Achtung! Obwohl die Unterprogramme fork und vfork mit Anwendungen der Grafikbibliothek verwendet werden können, darf der Kindprozess keine zusätzlichen Aufrufe von Unterprogrammen der Grafikbibliothek vornehmen. Die untergeordnete Anwendung übernimmt einige, aber nicht alle Grafikhardwareressourcen des übergeordneten Elements. Das Zeichnen durch den untergeordneten Prozess kann den Grafikadapter oder den Enhanced X-Server blockieren oder zu unvorhersehbaren Ergebnissen führen und das System in einen unvorhersehbaren Status versetzen.

Weitere Informationen finden Sie in der Datei /usr/lpp/GL/README .

Rückgabewerte

Nach erfolgreicher Beendigung gibt das Unterprogramm fork den Wert 0 an den Kindprozess zurück und gibt die Prozess-ID des Kindprozesses an den Elternprozess zurück. Andernfalls wird der Wert -1 an den Elternprozess zurückgegeben, es wird kein Kindprozess erstellt und die globale Variable errno wird gesetzt, um den Fehler anzuzeigen.

Fehlercodes

Das Unterprogramm fork ist erfolglos, wenn eine oder mehrere der folgenden Bedingungen erfüllt sind:

Element Beschreibung
EAGAIN Die Gesamtzahl der Prozesse, die entweder systemweit oder von einem einzelnen Benutzer ausgeführt werden, ist überschritten, oder das System verfügt nicht über die erforderlichen Ressourcen, um einen weiteren Prozess zu erstellen.
ENOMEM Für diesen Prozess ist nicht genügend Speicherplatz vorhanden.
EPROCLIM Wenn WLM aktiv ist, wurde möglicherweise der Grenzwert für die Anzahl der Prozesse oder Threads in der Klasse erreicht.