Übergeordnete Beziehung und Vererbung von Kindern in C

8

Ich bin völlig neu mit C.

  1. Welche Prozesselemente werden in einem untergeordneten Element geerbt, das mit fork(); ?

  2. erstellt wurde?
  3. Welche Prozesselemente unterscheiden sich vom übergeordneten Prozess?

John 16.02.2011, 19:41
quelle

5 Antworten

13

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 , was wirklich klar ist:

  

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 (siehe io_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 in fork() übernommen.

  •   
  • Das Beendigungssignal des Kinds ist immer SIGCHLD (siehe clone (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 von pthread_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 von F_SETOWN und F_SETSIG in fcntl (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.

    
peoro 16.02.2011 19:51
quelle
5

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.

    
maerics 16.02.2011 19:51
quelle
2
___ qstnhdr ___ Übergeordnete Beziehung und Vererbung von Kindern in C ___ answer5021390 ___

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.

    
___ answer5021394 ___

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.

    
___ tag123c ___ C ist eine universelle Computerprogrammiersprache, die für Betriebssysteme, Bibliotheken, Spiele und andere Hochleistungsanwendungen verwendet wird. Dieses Tag sollte bei allgemeinen Fragen zur C-Sprache verwendet werden, wie in der Norm ISO 9899: 2011 definiert. Fügen Sie ggf. ein versionsspezifisches Tag wie c99 oder c90 für Fragen zu älteren Sprachstandards hinzu. C unterscheidet sich von C ++ und es sollte nicht mit dem C ++ - Tag kombiniert werden, wenn ein rationaler Grund fehlt. ___ tag123fork ___ Die Funktion 'fork ()' ist die Unix / Linux / POSIX-Methode zum Erstellen eines neuen Prozesses durch Duplizieren des aufrufenden Prozesses. ___ answer5021466 ___

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 >     

___ answer5021391 ___

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 , was wirklich klar ist:

  

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

    
___ qstntxt ___

Ich bin völlig neu mit C.

  1. Welche Prozesselemente werden in einem untergeordneten Element geerbt, das mit %code% ?

  2. erstellt wurde?
  3. Welche Prozesselemente unterscheiden sich vom übergeordneten Prozess?

___
Steve Emmerson 16.02.2011 20:02
quelle
1

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.

    
Edwin Buck 16.02.2011 19:51
quelle
0

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 >     

Algorithmist 16.02.2011 19:59
quelle

Tags und Links