Linux: Prozess, fork

moha

Vice Admiral Special
Mitglied seit
14.06.2002
Beiträge
963
Renomée
1
hi, ich hoffe ich habe mit der frage das richtige forum getroffen.

es geht um folgendes. ich probiere gerade etwas mit prozessen und prozesszuständen unter linux rum.
bei wikipedia habe ich folgendes beispiel gefunden.

http://de.wikipedia.org/wiki/Prozess_(Computer)
Code:
Process p {

  result = fork();
  
  if(result==0) {
      // wird von child ausgeführt
    } else {
      // wird von parent ausgeführt
    }
}

Unter Unix wird ein neuer Prozess mittels des Systemaufrufs fork (Gabelung) erzeugt. Dabei wird ein zweiter identischer Prozess gestartet, während der erzeugende Prozess (auch Elternprozess genannt) weiterläuft. Alle Daten des ersten Prozesses, beispielsweise auch geöffnete Dateien, werden für den zweiten Prozess kopiert und stehen für diesen nun getrennt zur Verfügung. Jeder Prozess hat seinen eigenen Speicher. Der zweite Prozess ist ein vollwertiger Prozess ohne Einschränkung. Beide Prozesse können dann eigenständig weiterlaufen.

das verstehe ich soweit, fork wird aufgerufen, der prozess dubliziert:
*der childprozess geht in if-schleife
*der parentprozess in die else.

das ganze kann aber doch nicht gleichzeitig passieren. wie läuft das "prozesszustandstechnisch" ab, geht nach dem erzeugen des childs (mit fork) der parent in sleep bis er das ergebnis vom child zurückbekommt, oder wie läuft das. ich habe jetzt schon länger gesucht und finde kein beispiel wo das genau erklärt wird. *noahnung*

parent
|
fork-----------------------
|......................... |
parent(sleep) ....child(running)

wäre euch für etwas hilfe echt dankbar *bye2*
 
Nein, das IF selbst wird natürlich im Elternprozeß entschieden, und falls die Bedingung nicht erfüllt wird, geht es da auch weiter. Mit dem Fork kann man jetzt sagen, daß es gleich im Elternprozeß weitergeht, egal ob IF oder ELSE. Falls die IF-Bedingung erfüllt ist, wird in den Kindprozeß abgezweigt, und der rechnet solange nebenher, bis er soweit ist.
Auf ein Return muß ja nicht gewartet werden (man sollte dann natürlich keine Variablen im Elternprozeß verwursten, die erst zeitlich danach im Kindprozeß sinnvoll gefüllt werden).

Also:
Code:
Process p {

  result = fork();
  
  if(result==0) {
      wait(1000);
      printf("Thread 2 ist fertig");
    } else {
      printf("Thread 1 ist fertig");
    }
   printf("alles fertig");
}

Wenn result = 1 ist, dann steht in der Ausgabe:
Thread 1 ist fertig
alles ist fertig

ist result = 0, steht da:
Thread 1 ist fertig
alles ist fertig
Thread 2 ist fertig

und würde man das ohne fork() machen, stände da bei result = 0:
Thread 2 ist fertig
Thread 1 ist fertig
alles ist fertig

(ich bin jetzt mal davon ausgegangen, daß der Computer die drei Zeilen schneller als eine Sekunde abarbeitet^^)
 
Jup, das If bezieht sich auf den fork-Aufruf, nicht auf irgendein Resultat des neuen Prozesses.
Sprich beide Prozesse führen das if unabhängig voneinander aus, nur beim parent ist result eben nicht 0, sonst könnte man ja nicht mehr unterscheiden welcher Prozess das nun eigentlich gerade ist.
 
Nein, das IF selbst wird natürlich im Elternprozeß entschieden,

Nein, das IF wird in beiden Prozessen ausgewertet, denn ab dem fork()-Aufruf wird der gesamte Code jeweils von beiden Prozessen ausgeführt.
Falls die IF-Bedingung erfüllt ist, wird in den Kindprozeß abgezweigt, und der rechnet solange nebenher, bis er soweit ist.
Das stimmt auch nicht. Mit der IF-Abfrage können die Prozesse feststellen, wer sie nun sind, Eltern- oder Kindprozess. Das IF fragt die von fork() zurückgegebene PID (Prozess-ID) ab. Ist diese 0, handelt es sich um den Kindprozess, andernfalls ist es die PID des Kindprozesses, welche dem Elternprozess zurück geliefert wird, welcher das fork() aufgerufen hat.

Nach einem fork() führen beide Prozesse haargenau den selben Code aus, sofern nicht mit einem IF zwischen den beiden Prozessen unterschieden wird. Um das nochmal etwas zu verdeutlichen, noch ein kleines Beispiel:
Code:
result = fork()

printf("Ausgabe 1\n");

if(result == 0)
  printf("Ausgabe 2\n");
else
  printf("Ausgabe 3\n");

printf("Ausgabe 4\n");

In diesem Beispiel wird "Ausgabe 1" von beiden Prozessen ausgegeben. "Ausgabe 2" wird nur vom Kindprozess ausgegeben, während "Ausgabe 3" nur vom Elternprozess erzeugt wird. "Ausgabe 4" wird dann wiederum von beiden Prozessen ausgegeben, weil hier nicht mehr zwischen den beiden Prozessen unterschieden wird.

Was die ursprüngliche Frage über die Reihenfolge der Abarbeitung angeht, das liegt am Scheduler des Betriebssystems. Es kann hier keine Aussage getroffen werden, wann welcher Prozess abgearbeitet wird, und welcher Prozess zuerst fertig ist.
 
Zuletzt bearbeitet:
Achso, dann hab ich das falsch verstanden gehabt. Die Threads bestehen also schon ab result = fork(); und man verteilt mit dem IF nur Aufgaben auf Parent oder Child.
 
Achso, dann hab ich das falsch verstanden gehabt. Die Threads bestehen also schon ab result = fork(); und man verteilt mit dem IF nur Aufgaben auf Parent oder Child.

Jupp, aber es sind Prozesse und nicht nur Threads. Mit einem fork() wird der gesamte Prozess mit allem drum und dran dupliziert, so dass dann zumindest logisch alles doppelt existiert.
 
Zurück
Oben Unten