You are not logged in.

  • Login

1

Thursday, July 8th 2010, 8:52pm

ein fork() Klausurfrage

Abend,

ich habe hier eine Klausurfrage und kann mir leider die Antwort nicht erklären.

C/C++ Quellcode

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include <stdio.h>
#include <unistd.h>
//#include <stdlib.h>
int main(int argc,char *argv[]){
	int i;
 
	printf("wo ist das printf");
	printf("PID%d",getpid());
 
	for(i = 0; i < 4; i++){
		fork();
		while(1);
	}
	return 0;
}


Nun die Frage: Wieviele Prozesse laufen auf dem Rechner, nachdem sie alle die Endlosschleife erreicht haben?
Frage b): Verschieben sie die Endlosschleife hinter die FOR-Schleife und beantworten Sie die gleiche Frage wie in a);

Beim A ist die Lösung 2 das habe ich kapiert. Aber die Lösung von B ist mir unerklärlich ( 8 )...
Wieso werden die print-Befehle nicht ausgegeben?

Bitte um Hilfe

2

Thursday, July 8th 2010, 9:24pm

Also warum da 8 rauskommen soll kann ich dir nicht erklären, ich hab den Code mal getestet und bei mir kommen 16 Prozesse raus (das deckt sich auch mit meiner Erwartung).
Überleg dir einfach mal was der fork befehl macht und was dann in jedem einzelnen Prozess passiert.

Das printf funktioniert nicht, weil die Ausgaben von printf gebuffert werden und erst ausgegeben wenn ein newline in stdout geschrieben wird. Da bei deinen printfs kein newline vorkommt, wird es deswegen nicht direkt ausgegeben. Würde das Programm zuende laufen würde es dann auch ausgegeben, da du aber ne endlosschleife hast kommt es nie so weit. Einfach mal das while(1) ganz rauslassen und du wirst sehen, dass die ausgabe erscheint.

3

Thursday, July 8th 2010, 9:30pm

fork() kopiert den Prozess 1 zu 1.

Wenn nun die Endlosschleife hinter der for-Schleife liegt passiert folgendes:

P1: erzeugt 4 Fork-Prozesse
P2: erzeugt nur noch 3 Fork Prozesse (da i bei dem fork schon auf 1 stand)
P3 -> 2
P4 -> 1

4 + 3 + 2 +1 = 8

4

Thursday, July 8th 2010, 10:23pm

Also warum da 8 rauskommen soll kann ich dir nicht erklären, ich hab den Code mal getestet und bei mir kommen 16 Prozesse raus (das deckt sich auch mit meiner Erwartung).
Überleg dir einfach mal was der fork befehl macht und was dann in jedem einzelnen Prozess passiert.

Das printf funktioniert nicht, weil die Ausgaben von printf gebuffert werden und erst ausgegeben wenn ein newline in stdout geschrieben wird. Da bei deinen printfs kein newline vorkommt, wird es deswegen nicht direkt ausgegeben. Würde das Programm zuende laufen würde es dann auch ausgegeben, da du aber ne endlosschleife hast kommt es nie so weit. Einfach mal das while(1) ganz rauslassen und du wirst sehen, dass die ausgabe erscheint.


Ja, entschuldige. Ich habe bisschen herumprobiert. Ich habe die Schleife geändert. In der Klausur stand dort i < 3.
Werde jetzt mal der Beschreibung von Spider nachgehen, danke soweit.
Ich hoffe ich verstehe das jetzt..

PS: natürlich gibt es mit \n nun endlich auch eine Ausgabe

5

Thursday, July 8th 2010, 10:36pm

Denke aber dass das nicht ganz richtig ist. 4+3+2+1 ist ja nicht 8 sondern 10 ;) Abgesehen davon käme bei i < 3 ja 1+2+3 = 6 raus.

Es ist ja so, dass ein fork ne exakte Kopie des Prozesses erstellt und dann beide im gleichen zustand weiterlaufen. Das bedeutet beim ersten Schleifendurchlauf werden aus dem einen Prozess zwei Prozesse.
Beim nächsten Schleifendurchlauf erstellt JEDER dieser Prozesse wieder ne Kopie von sich, also sind es dann schon vier. So geht das dann weiter und in jedem Schleifendurchlauf verdoppelt sich die prozessanzahl, daher ist die Anzahl der Prozesse für i<3 2^3 = 8 und für i<4 2^4= 16

6

Thursday, July 8th 2010, 10:53pm

Denke aber dass das nicht ganz richtig ist. 4+3+2+1 ist ja nicht 8 sondern 10 ;) Abgesehen davon käme bei i < 3 ja 1+2+3 = 6 raus.

Es ist ja so, dass ein fork ne exakte Kopie des Prozesses erstellt und dann beide im gleichen zustand weiterlaufen. Das bedeutet beim ersten Schleifendurchlauf werden aus dem einen Prozess zwei Prozesse.
Beim nächsten Schleifendurchlauf erstellt JEDER dieser Prozesse wieder ne Kopie von sich, also sind es dann schon vier. So geht das dann weiter und in jedem Schleifendurchlauf verdoppelt sich die prozessanzahl, daher ist die Anzahl der Prozesse für i<3 2^3 = 8 und für i<4 2^4= 16


Ahh, gut.
Kleiner Widerspruch in deiner Aussage. Aber die unteren Angaben sind korrekt. Danke für die Hilfe ich kam einach incht darauf das die Schleife dann schon weiter gezählt wird.
Danke vielmals.
Super jetzt ist es nicht mehr schwer zu verstehen, vergiss das mit dem Widerspruch habe deine Aussage nun auch kapiert.

This post has been edited 1 times, last edit by "Tetris" (Jul 9th 2010, 1:33am)


Similar threads

Social bookmarks