Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » GNU/Linux » vfork / fork Unklarheiten

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 < [ 2 ]
000
01.10.2004, 10:19 Uhr
mike
Pinguinhüpfer
(Operator)


Moin
Ich hab mich grade mit fork gespielt und verstehe einige Sachen nicht

C++:
#include <stdio.h>
#include <sys/types.h>

int
main(void)
{
  int var = 0, status;
  pid_t pid;

  setvbuf(stdout, NULL, _IOFBF, BUFSIZ);
  printf("***** main *****\n");

  switch(pid = vfork()) { /* oder fork */
    case -1:
      fprintf(stderr, "FATAL");
      break;
    case 0:
      var++;
      printf("** Child **\n");
      _exit(0); /* bei fork nicht */
      break;
    default:
      printf("** Parent **\n");
      break;
  }
  wait(&status);
  printf("** PID=%d val=%d addr=%p (%s)**\n",pid,var,&var,(pid==0)?"Child":"Parent");

  return 0;
}


Ausgabe von vfork:

Zitat:

***** main *****
** Child **
** Parent **
** PID=396 val=1 addr=0xbffffca0 (Parent)**


Wenn ich bei vfork _exit weglasse, beendet sich das Programm ganz normal. Es sollte aber ein deadlock entstehen - wie erkennt man den? Trotz weglassen von _exit wird das letzte printf nie erreicht - ist das ein deadlock?

Ausgabe von fork:

C++:
***** main *****
** Child **
** PID=0 val=1 addr=0xbffffd70 (Child)**
***** main *****
** Parent **
** PID=416 val=0 addr=0xbffffd70 (Parent)**


Warum haben die Variabeln bei fork die gleiche Adresse? Ich habe gedacht bei fork bekommt jeder Child Process einen eignen Stack/Heap Bereich

Vielen Dank im Voraus,
mfg michael
--
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
01.10.2004, 10:37 Uhr
typecast
aka loddab
(Operator)


Das passt wohl besser nach Linux.
--
All parts should go together without forcing. ... By all means, do not use a hammer. (IBM maintenance manual, 1925)
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
01.10.2004, 14:12 Uhr
virtual
Sexiest Bit alive
(Operator)


Was meinst Du mit Deadlock, wo sollte Dieser entstehen und vor allem warum? wg des Printfs? - Ein Deadlock kann allenfalls auftreten, wenn Du zwei Resourcen (oder mehr) hast, die wechelseitig von zwei Prozessen benutzt werden sollen:

zB Dateien A und B sollen von Processen P1 und P2 gelockt werden.
Wenn P1 erst A und dann B locken würde, P2 erst B und dann A, dann hättest Du eine Deadlock gefahr, andernfalls nicht (daher ist die gängige strategie, deadlocks zu vermeiden ja auch, daß man Resourcen immer in der gleichen Reihenfolge lockt).

Das mit der gleichen Speicherbereich läßt sich nicht mit Hilfe der Adressen überprüfen: Wir leben im Zeitalter der virtuellen Adressräume, wo zwei Processes vom gleichen Binary auch virtuell gleiche Adressen haben.
--
Gruß, virtual
Quote of the Month
Ich eß' nur was ein Gesicht hat (Creme 21)
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
01.10.2004, 16:15 Uhr
mike
Pinguinhüpfer
(Operator)


Hi!
Also dann hab ich das fork richtig verstanden aber falsch umgesetzt Ich hab nämlich gelesen, dass der Kinderprozesss seinen eigenen Stack/Heap Bereich bekommt (zumindest bei BSD - Linux macht das mit dem COW Verfahren irgendwie anders).
- da die Variablen aber die gleichen Adressen hatten, war ich verwirrt. "Virtuelle Adressräume" - hmm. ich glaube es haberts bei mir an den Grundlagen - sagt mir momentan nicht viel

Zu vfork hätte ich noch ne kleine Frage:
Warum wird bei vfork "***** main *****" bzw. "** PID=396 val=1 addr=0xbffffca0 (Parent)**" nur 1 Mal ausgegeben? Wenn ich auf Vollpufferung umstelle müsste er doch beides anzeigen oder?

Danke,
mfg michael
--
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
01.10.2004, 16:20 Uhr
virtual
Sexiest Bit alive
(Operator)



Zitat von mike:
Hi!
Zu vfork hätte ich noch ne kleine Frage:
Warum wird bei vfork "***** main *****" bzw. "** PID=396 val=1 addr=0xbffffca0 (Parent)**" nur 1 Mal ausgegeben? Wenn ich auf Vollpufferung umstelle müsste er doch beides anzeigen oder?

Danke,
mfg michael

Weil du im falle von vfork ein exit machst (wenn ich dich richtig verstanden habe).
--
Gruß, virtual
Quote of the Month
Ich eß' nur was ein Gesicht hat (Creme 21)
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
01.10.2004, 16:27 Uhr
mike
Pinguinhüpfer
(Operator)


Ohne _exit kommt es bei vfork trotzdem nicht
--
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
006
01.10.2004, 16:41 Uhr
virtual
Sexiest Bit alive
(Operator)


Oh, also daß wir hier verwechslungen vorbeugen:

1. Ich hoffe, dir ist klar, daß das "*** main ***" wirklich nur einmal kommen darf: fork startet das Programm ja nicht neu, sondern macht einfach nur aus einem Prozess einen neuen, weiteren, der eben nach dem fork genauso weiterläuft, wie der andere

2. Die Zeile mit dem "** PID ... " kommt ohne das exit in beiden fällen zweimal, jedenfalls bei mir. Würde ich auch so erwarten.
--
Gruß, virtual
Quote of the Month
Ich eß' nur was ein Gesicht hat (Creme 21)
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
007
01.10.2004, 17:17 Uhr
mike
Pinguinhüpfer
(Operator)



Zitat von virtual:

1. Ich hoffe, dir ist klar, daß das "*** main ***" wirklich nur einmal kommen darf: fork startet das Programm ja nicht neu, sondern macht einfach nur aus einem Prozess einen neuen, weiteren, der eben nach dem fork genauso weiterläuft, wie der andere

Hmm. Komisch. Ich hab folgendes und "**main**" kommt 2 Mal:

C++:
#include <stdio.h>
#include <sys/types.h>

int
main(void)
{
  int var = 0, status;
  pid_t pid;
  fflush(stdout);
  setvbuf(stdout, NULL, _IOFBF, BUFSIZ);
  printf("***** main *****\n");

  switch(pid = fork()) { /* OR fork */
    case -1:
      fprintf(stderr, "FATAL");
      break;
    case 0:
      var++;
      printf("** Child **\n");
      //_exit(0); ||MLC||
      break;
    default:
      printf("** Parent **\n");
      break;
  }
  wait(&status);
  printf("** PID=%d val=%d addr=%p (%s)**\n",pid,var,&var,(pid==0)?"Child":"Parent");

  return 0;
}



Code:
Michael-Vodeps-Computer:~/Desktop michaelvodep$ gcc -o test test.c
Michael-Vodeps-Computer:~/Desktop michaelvodep$ ./test
***** main *****
** Child **
** PID=0 val=1 addr=0xbffffd70 (Child)**
***** main *****
** Parent **
** PID=615 val=0 addr=0xbffffd70 (Parent)**
Michael-Vodeps-Computer:~/Desktop michaelvodep$




Zitat von virtual:

2. Die Zeile mit dem "** PID ... " kommt ohne das exit in beiden fällen zweimal, jedenfalls bei mir. Würde ich auch so erwarten.

Wenn ich vfork nehme, ohne _exit, kommt es trotzdem nicht Bei fork (siehe oben) kommts 2 Mal
Das liegt wahrscheinlich an BSD. Mal schaun warum das so ist

mfg
--
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
008
01.10.2004, 17:31 Uhr
mike
Pinguinhüpfer
(Operator)


Hallo
Jetzt kappier ich gar nix mehr. Habs jetzt auf Debian gemacht.
vfork macht ohne _exit ne Endlosschleife
http://mike.dev-geeks.org/stuff/mike.txt

Selber Code bei BSD

Code:
***** main *****
** Child **
** Parent **
** PID=396 val=1 addr=0xbffffca0 (Parent)**



Kompliziert^2

mfg
--

Dieser Post wurde am 01.10.2004 um 17:36 Uhr von mike editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
009
01.10.2004, 19:31 Uhr
mike
Pinguinhüpfer
(Operator)


Ich hab ne Lösung

C++:
#include <stdio.h>
#include <sys/types.h>

int main(void)
{
  int var = 0, status;
  pid_t pid;
  setvbuf(stdout, NULL, _IOFBF, BUFSIZ);
  printf("***** main *****\n");

  switch(pid = vfork()) { /* OR fork */
    case -1:
      fprintf(stderr, "FATAL");
      break;
    case 0:
      var++;
      printf("** Child **\n");
      printf("** PID=%d val=%d addr=%p (%s)**\n",pid,var,&var,(pid==0)?"Child":"Parent");
      _exit(0);
      /*_exit(0);*/ /* IF FORK -> NO _exit */
      break;
    default:
      wait(&status);
      printf("** Parent **\n");
      printf("** PID=%d val=%d addr=%p (%s)**\n",pid,var,&var,(pid==0)?"Child":"Parent");
      break;
  }

  return 0;
}



Das war der Grund für die Endlosschleife. Wenn das _exit weg war hat der Child Prozess auf den Parent gewartet und umgekehrt *g*
Mich wundert aber, dass FreeBSD abbricht. However

mfg
--
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 < [ 2 ]     [ 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: