Das hat nicht viel mit C zu tun, eher mit fork()
, was ein POSIX-Systemaufruf ist (und ich denke, dass es sich auf verschiedenen Systemen anders verhalten könnte).
Ich würde vorschlagen, dass Sie das fork
manual
fork()
erstellt einen neuen Prozess durch Duplizieren des aufrufenden Prozesses. Das Neu, das als Kind bezeichnet wird, ist ein exaktes Duplikat des Anrufenden Prozess, der als der Elternteil bezeichnet wird, mit Ausnahme der folgenden Punkte:
Das untergeordnete Element hat eine eigene eindeutige Prozess-ID. Diese PID stimmt nicht mit der ID einer vorhandenen Prozessgruppe überein (
setpgid
(2)).Die Prozess-ID des untergeordneten Elements entspricht der Prozess-ID des übergeordneten Elements.
Das untergeordnete Element erbt nicht die Speichersperren seines übergeordneten Objekts (
mlock
(2),mlockall
(2)).Prozessressourcenauslastungen (
getrusage
(2)) und CPU-Zeitzähler (times
(2)) werden im untergeordneten Element auf Null zurückgesetzt.Die Menge der ausstehenden Signale des Kindes ist anfänglich leer (
sigpending
(2)).Das Kind erbt keine Semaphor-Anpassungen von seinem Elternteil (
semop
(2)).Das untergeordnete Element erbt keine Datensatzsperren von seinem übergeordneten Element (
fcntl
(2)).Das untergeordnete Element erbt keine Zeitgeber von seinem übergeordneten Element (
setitimer
(2),alarm
(2),timer_create
(2)).Das untergeordnete Element erbt keine ausstehenden asynchronen E / A-Operationen von seinem übergeordneten Element (
aio_read
(3),aio_write
(3)) und erbt auch nicht alle asynchronen E / A-Kontexte von seinem übergeordneten Element (sieheio_setup
(2)).Die Prozessattribute in der vorhergehenden Liste sind alle in angegeben POSIX.1-2001. Eltern und Kind unterscheiden sich auch in Bezug auf die folgende Linux-spezifische Prozessattribute:
Das untergeordnete Element erbt keine Verzeichnisänderungsbenachrichtigungen (dnotify) von seinem übergeordneten Element (siehe die Beschreibung von F_NOTIFY in
fcntl
(2)).Die Einstellung
prctl
(2)PR_SET_PDEATHSIG
wird zurückgesetzt, so dass das untergeordnete Objekt kein Signal empfängt, wenn sein übergeordnetes Element beendet wird.Speicherzuordnungen, die mit dem Flag
madvise
(2)MADV_DONTFORK
markiert wurden, werden nicht infork()
übernommen.Das Beendigungssignal des Kinds ist immer
SIGCHLD
(sieheclone
(2)).Beachten Sie die folgenden weiteren Punkte:
Der untergeordnete Prozess wird mit einem einzelnen Thread erstellt - dem mit
fork()
. Der gesamte virtuelle Adressraum des Elternteils ist repliziert im Kind, einschließlich der Zustände der Mutexe, Zustand Variablen und andere Pthreads-Objekte; die Verwendung vonpthread_atfork
(3) kann hilfreich sein für den Umgang mit Problemen, die dies verursachen kann.Das Kind erbt Kopien des Satzes offener Datendekriptoren des Elternteils. Jeder Dateideskriptor im Kind verweist auf das gleiche open Dateibeschreibung (siehe
open
(2)) als den entsprechenden Dateideskriptor im Elternteil. Dies bedeutet, dass die beiden Deskriptoren die geöffnete Datei teilen Statusflags, aktueller Dateioffset und signalgesteuerte E / A-Attribute (Siehe die Beschreibung vonF_SETOWN
undF_SETSIG
infcntl
(2)).Das untergeordnete Objekt erbt Kopien des übergeordneten Satzes von Warteschlangenbeschreibern offener Nachrichten (siehe
mq_overview
(7)). Jeder Deskriptor im Kind verweist auf die gleiche Beschreibung der offenen Nachrichtenwarteschlange wie die entsprechende Nachricht Deskriptor im Elternteil. Dies bedeutet, dass die zwei Deskriptoren teilen die gleichen Flags (mq_flags
).Das untergeordnete Element erbt Kopien der offenen Verzeichnisströme des übergeordneten Elements (siehe
opendir
(3)). POSIX.1-2001 sagt, dass die entsprechende Verzeichnisströme im übergeordneten und untergeordneten Verzeichnis können das Verzeichnis freigeben Stream-Positionierung; auf Linux / glibc nicht.
Wenn Sie sich für Linux interessieren, sollten Sie auch den Systemaufruf clone
prüfen, mit dem Sie genauer spezifizieren können, was Sie wollen.
Die fork (2) man-Seite auf Ihrem System ( man fork
) sollte Ihnen bessere Details geben, aber im Allgemeinen erbt das Kind nur die Liste der Dateideskriptoren der Eltern, einschließlich geöffneter Dateien, Sockets und Prozess-Handles.
Auf der Manpage meines Systems (Mac OS X 10.6.6):
Der Kindprozess hat seine eigene Kopie der Deskriptoren der Eltern. Diese Deskriptoren verweisen auf dieselben zugrunde liegenden Objekte Beispielsweise werden Dateizeiger in Dateiobjekten freigegeben zwischen dem Kind und dem Elternteil, so dass ein lseek (2) auf a Deskriptor im Kindprozess kann ein nachfolgendes Lesen oder beeinflussen schreibe beim Elternteil. Dieses Kopieren des Deskriptors wird auch von die Shell, um die Standardeingabe und -ausgabe für neu geschaffene Prozesse sowie das Einrichten von Pipes.
Die fork (2) man-Seite auf Ihrem System ( %code% ) sollte Ihnen bessere Details geben, aber im Allgemeinen erbt das Kind nur die Liste der Dateideskriptoren der Eltern, einschließlich geöffneter Dateien, Sockets und Prozess-Handles.
Auf der Manpage meines Systems (Mac OS X 10.6.6):
Der Kindprozess hat seine eigene Kopie der Deskriptoren der Eltern. Diese Deskriptoren verweisen auf dieselben zugrunde liegenden Objekte Beispielsweise werden Dateizeiger in Dateiobjekten freigegeben zwischen dem Kind und dem Elternteil, so dass ein lseek (2) auf a Deskriptor im Kindprozess kann ein nachfolgendes Lesen oder beeinflussen schreibe beim Elternteil. Dieses Kopieren des Deskriptors wird auch von die Shell, um die Standardeingabe und -ausgabe für neu geschaffene Prozesse sowie das Einrichten von Pipes.
Es gibt keine objektorientierte Vererbung in C.
Fork in C ist im Grunde der Prozess gestoppt wird, während es ausgeführt wird, und eine ganze Kopie davon in (effektiv) einen anderen Speicherplatz gemacht wird, dann beide Prozesse aufgefordert werden, fortzufahren. Sie werden beide an der Stelle fortgesetzt, an der der Elternteil pausiert wurde. Sie können nur feststellen, in welchem Prozess Sie sich befinden, indem Sie den Rückgabewert des Aufrufs %code% überprüfen.
In einer solchen Situation erbt das Kind nicht wirklich alles vom Elternprozess, es ist eher so, als würde es eine komplette Kopie von allem bekommen, was der Elternteil hatte.
Die einzigen Dinge des Kindes, die sich von seinen Eltern unterscheiden, sind seine
PPID, d. h. übergeordnete Prozess-ID und
PID-Prozess-ID .
Und wenn es zur Ähnlichkeit kommt, erbt child process die FILE DESCRIPTOR-Tabelle seines Elternteils. Sie sehen also, dass immer drei FILE DESCRIPTORS von child immer besetzt sind, die STDIN, STDOUT und STDERR entsprechen >
Das hat nicht viel mit C zu tun, eher mit %code% , was ein POSIX-Systemaufruf ist (und ich denke, dass es sich auf verschiedenen Systemen anders verhalten könnte).
Ich würde vorschlagen, dass Sie das %code% manual
%code% erstellt einen neuen Prozess durch Duplizieren des aufrufenden Prozesses. Das Neu, das als Kind bezeichnet wird, ist ein exaktes Duplikat des Anrufenden Prozess, der als der Elternteil bezeichnet wird, mit Ausnahme der folgenden Punkte:
Das untergeordnete Element hat eine eigene eindeutige Prozess-ID. Diese PID stimmt nicht mit der ID einer vorhandenen Prozessgruppe überein ( %code% (2)).
Die Prozess-ID des untergeordneten Elements entspricht der Prozess-ID des übergeordneten Elements.
Das untergeordnete Element erbt nicht die Speichersperren seines übergeordneten Objekts ( %code% (2), %code% (2)).
Prozessressourcenauslastungen ( %code% (2)) und CPU-Zeitzähler ( %code% (2)) werden im untergeordneten Element auf Null zurückgesetzt.
Die Menge der ausstehenden Signale des Kindes ist anfänglich leer ( %code% (2)).
Das Kind erbt keine Semaphor-Anpassungen von seinem Elternteil ( %code% (2)).
Das untergeordnete Element erbt keine Datensatzsperren von seinem übergeordneten Element ( %code% (2)).
Das untergeordnete Element erbt keine Zeitgeber von seinem übergeordneten Element ( %code% (2), %code% (2), %code% (2)).
Das untergeordnete Element erbt keine ausstehenden asynchronen E / A-Operationen von seinem übergeordneten Element ( %code% (3), %code% (3)) und erbt auch nicht alle asynchronen E / A-Kontexte von seinem übergeordneten Element (siehe %code% (2)).
Die Prozessattribute in der vorhergehenden Liste sind alle in angegeben POSIX.1-2001. Eltern und Kind unterscheiden sich auch in Bezug auf die folgende Linux-spezifische Prozessattribute:
Das untergeordnete Element erbt keine Verzeichnisänderungsbenachrichtigungen (dnotify) von seinem übergeordneten Element (siehe die Beschreibung von F_NOTIFY in %code% (2)).
Die Einstellung %code% (2) %code% wird zurückgesetzt, so dass das untergeordnete Objekt kein Signal empfängt, wenn sein übergeordnetes Element beendet wird.
Speicherzuordnungen, die mit dem Flag %code% (2) %code% markiert wurden, werden nicht in %code% übernommen.
Das Beendigungssignal des Kinds ist immer %code% (siehe %code% (2)).
Beachten Sie die folgenden weiteren Punkte:
Der untergeordnete Prozess wird mit einem einzelnen Thread erstellt - dem mit %code% . Der gesamte virtuelle Adressraum des Elternteils ist repliziert im Kind, einschließlich der Zustände der Mutexe, Zustand Variablen und andere Pthreads-Objekte; die Verwendung von %code% (3) kann hilfreich sein für den Umgang mit Problemen, die dies verursachen kann.
Das Kind erbt Kopien des Satzes offener Datendekriptoren des Elternteils. Jeder Dateideskriptor im Kind verweist auf das gleiche open Dateibeschreibung (siehe %code% (2)) als den entsprechenden Dateideskriptor im Elternteil. Dies bedeutet, dass die beiden Deskriptoren die geöffnete Datei teilen Statusflags, aktueller Dateioffset und signalgesteuerte E / A-Attribute (Siehe die Beschreibung von %code% und %code% in %code% (2)).
Das untergeordnete Objekt erbt Kopien des übergeordneten Satzes von Warteschlangenbeschreibern offener Nachrichten (siehe %code% (7)). Jeder Deskriptor im Kind verweist auf die gleiche Beschreibung der offenen Nachrichtenwarteschlange wie die entsprechende Nachricht Deskriptor im Elternteil. Dies bedeutet, dass die zwei Deskriptoren teilen die gleichen Flags ( %code% ).
Das untergeordnete Element erbt Kopien der offenen Verzeichnisströme des übergeordneten Elements (siehe %code% (3)). POSIX.1-2001 sagt, dass die entsprechende Verzeichnisströme im übergeordneten und untergeordneten Verzeichnis können das Verzeichnis freigeben Stream-Positionierung; auf Linux / glibc nicht.
Wenn Sie sich für Linux interessieren, sollten Sie auch den Systemaufruf %code% prüfen, mit dem Sie genauer spezifizieren können, was Sie wollen.
Ich bin völlig neu mit C.
Welche Prozesselemente werden in einem untergeordneten Element geerbt, das mit %code% ?
Welche Prozesselemente unterscheiden sich vom übergeordneten Prozess?
Es gibt keine objektorientierte Vererbung in C.
Fork in C ist im Grunde der Prozess gestoppt wird, während es ausgeführt wird, und eine ganze Kopie davon in (effektiv) einen anderen Speicherplatz gemacht wird, dann beide Prozesse aufgefordert werden, fortzufahren. Sie werden beide an der Stelle fortgesetzt, an der der Elternteil pausiert wurde. Sie können nur feststellen, in welchem Prozess Sie sich befinden, indem Sie den Rückgabewert des Aufrufs fork()
überprüfen.
In einer solchen Situation erbt das Kind nicht wirklich alles vom Elternprozess, es ist eher so, als würde es eine komplette Kopie von allem bekommen, was der Elternteil hatte.
Die einzigen Dinge des Kindes, die sich von seinen Eltern unterscheiden, sind seine
PPID, d. h. übergeordnete Prozess-ID und
PID-Prozess-ID .
Und wenn es zur Ähnlichkeit kommt, erbt child process die FILE DESCRIPTOR-Tabelle seines Elternteils. Sie sehen also, dass immer drei FILE DESCRIPTORS von child immer besetzt sind, die STDIN, STDOUT und STDERR entsprechen >