Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » GNU/Linux » fork()

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 <
000
16.01.2008, 17:44 Uhr
banshee



hallo,

ich habe mal eine Frage zu folgendem Codestück


C++:
void end(void)
{
  printf ("2");
}

int main ()
{
  if(fork() == 0)
    atexit(end);

  if(fork() == 0)
    printf("0");
  else
    printf("1");
    return 0;
}


atexit schreibt dabei die übergebene Funktion in eine Liste, die am Programmende automatisch ausgeführt werden. Angeblich wird atexit nur einmal ausgeführt, die Funktion end dagegen 2x.

Ich erklär jetzt mal wie ich es verstanden habe:

Nach dem ersten fork habe ich einen Vater- und einen Kindsprozess. Im Kindsprozess wird atexit mit end aufgerufen. Beim zweiten if wird dann ein zweiter Kindsprozess vom Vater erstellt und noch ein Kindsprozess vom ersten Kindsprozess. Dadurch wird zweimal(?) die printf-Anweisung ausgeführt (oder liefert der erste Kindsprozess trotzdem nochmal 0 zurücl, obwohl er ja selber ein Vaterprozess ist).
Dann wird jeweils von den beiden Vätern die andere printf-Anweisung ausgeführt und alle 4 Prozesse landen am Programmende, sodass end eigentlich 4x ausgeführt werden müsste.
Denke ich da irgendwo falsch?
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
17.01.2008, 03:18 Uhr
0xdeadbeef
Gott
(Operator)


Nach dem ersten Fork-Aufruf wird in einem der beiden Prozesse atexit ausgeführt, und nur der gibt dann die Registrierung der end-Funktion an seinen Kind-Prozess weiter, wenn fork() erneut ausgeführt wird. Der andere Prozess, in dem atexit nicht ausgeführt wird, hat die Registrierung selbst nicht und gibt sie beim nächsten Forken auch nicht weiter, d.h. end wird bei zwei Prozessen am Ende ausgeführt. Das ist schon richtig so.
--
Einfachheit ist Voraussetzung für Zuverlässigkeit.
-- Edsger Wybe Dijkstra
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
17.01.2008, 11:08 Uhr
banshee



aaaah,

bei deinen Antworten wird man immerwieder erleuchtet

Habe ich den Rest auch richtig verstanden?

Also der Ursprungsprozess führt printf("1") aus,
der erste Kindsprozess atexit(end) printf("0"), printf("2")
der zweite Kindsprozess printf("0") und
der Kindsprozess des Kindsprozesses printf("0"), printf("2") ?
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
21.01.2008, 17:38 Uhr
kronos
Quotenfisch
(Operator)


ja, aber fork ist ziemlich lahm. weniger lahm sind posix threads.
--
main($)??<-$<='?'>>2?main($-!!putchar(
(("$;99M?GD??(??/x0d??/a:???;a"+'?'/4)
??($??)+'?'/3-2-1+$%2)??''?')):'?';??>
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
21.01.2008, 18:49 Uhr
0xdeadbeef
Gott
(Operator)


Da will ich aber nen Benchmark für sehen.

Aber mal im Ernst, Prozesse und Threads sind unterschiedliche Dinge. Wo du Threads brauchst, nimm Threads, wo du Prozesse brauchst, nimm Prozesse. Zum Beispiel kannst du mit Threads nicht daemonisieren. Ansonsten,

Der Ursprungsprozess hat zweimal fork() != 0, dementsprechend gibt er "1" aus.
Der erste Kindprozess hat beim ersten mal fork() == 0 und beim zweiten Mal fork() != 0, dementsprechend gibt er "12" aus.
Der zweite Kindprozess des Ursprungsprozesses erlebt das erste fork() nicht mit und hat beim zweiten fork() == 0, dementsprechend gibt er "0" aus, und
Der Kindprozess des ersten Kindprozesses erlebt das erste fork() nicht mit, übernimmt aber die im Vaterprozess mit atexit() registrierte Funktion, und hat beim zweitem mal fork() == 0, dementsprechend gibt er "02" aus.
--
Einfachheit ist Voraussetzung für Zuverlässigkeit.
-- Edsger Wybe Dijkstra
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 <     [ GNU/Linux ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: