Ü8 H2 fork()????

muehlenbetreiber
Erstie
Erstie
Beiträge: 14
Registriert: 11. Aug 2008 13:20

Ü8 H2 fork()????

Beitrag von muehlenbetreiber »

Hallo,

ich verstehe leider nicht so geanu was das mit dem fork() auf sich hat! Macht fork einen printf ( "hello!\n" ) ? Weil sonst könnte ich ja an der Aufgabe (For-Schleife) soviel rumbasteln wie ich wollte und es kämme nur ein "hello!"
Mir ist klar das fork() ein Prozess erzeugt, nur WELCHEN???

Kann mir bitte jemand helfen

Danke schon mal

SebFreutel
Computerversteher
Computerversteher
Beiträge: 317
Registriert: 30. Okt 2006 21:54

Re: Ü8 H2 fork()????

Beitrag von SebFreutel »

fork() erzeugt nicht einen beliebigen Prozess, es klont den aufrufenden, der dann an derselben Stelle seine Ausführung startet, wo er selbst gestartet wurde.

Benutzeravatar
oren78
BSc Spammer
BSc Spammer
Beiträge: 1373
Registriert: 17. Nov 2006 17:47
Wohnort: Darmstadt

Re: Ü8 H2 fork()????

Beitrag von oren78 »

SebFreutel hat geschrieben:fork() erzeugt nicht einen beliebigen Prozess, es klont den aufrufenden, der dann an derselben Stelle seine Ausführung startet, wo er selbst gestartet wurde.
ähhhmm...eigentlich hätte ich gedacht er wurde eine zeile drunter erst seine ausführung starten, war das nicht so??
"Unter allen menschlichen Entdeckungen sollte die Entdeckung der Fehler die wichtigste sein.", Stanisław Jerzy Lec

SebFreutel
Computerversteher
Computerversteher
Beiträge: 317
Registriert: 30. Okt 2006 21:54

Re: Ü8 H2 fork()????

Beitrag von SebFreutel »

oren78 hat geschrieben:
SebFreutel hat geschrieben:fork() erzeugt nicht einen beliebigen Prozess, es klont den aufrufenden, der dann an derselben Stelle seine Ausführung startet, wo er selbst gestartet wurde.
ähhhmm...eigentlich hätte ich gedacht er wurde eine zeile drunter erst seine ausführung starten, war das nicht so??
naja.. klar, er fängt hinter dem fork() an, das ihn aufgerufen hat, aber wenn da z.B. steht
"x = fork();"
wird die Zuweisung im alten und im neuen Prozess ausgeführt.

Benutzeravatar
CarstenHaubold
Windoof-User
Windoof-User
Beiträge: 39
Registriert: 11. Feb 2008 10:50

Re: Ü8 H2 fork()????

Beitrag von CarstenHaubold »

Da hatten wir heute auch unsren Spaß mit, also:
fork() klont den aktuellen Prozess komplett, mit Variablen und auch dem ProcessCounter wenn du mal an Assembler denkst.
Der neue Prozess fängt sogesehen während der Ausführung von fork() an zu laufen.

Der interessante Teil daran ist nun, dass fork() in dem Prozess in dem es aufgerufen wurde(also vor dem klonen) die ID des neu angelegten Prozesses zurückgibt, in dem angelegten prozess aber 0.

Kurzes beispiel:

Code: Alles auswählen

int main(){
  int test=fork();
  printf("%d\n",test);
  return 0;
}
Hier würde während der Ausführung der Variablen test in Parent und Child Process verschiedene Werte zugewiesen, z.B. parent.test = 29351 und child.test=0.. Welcher aufruf von printf aber zuerst passiert hängt davon ab welcher prozess zuerst von der CPU bearbeitet wird.

Hoffe das hilft euch weiter :D

xilef
Mausschubser
Mausschubser
Beiträge: 48
Registriert: 26. Jan 2008 04:47

Re: Ü8 H2 fork()????

Beitrag von xilef »

Hallo,

ich habe das Programm abgeschrieben und auf den Poolrechnern ausgeführt.

Interssanterweise gibt mir das Programm mal mehr mal weniger hello! aus. Irgendwie steh ich vor einem Rätsel.
Also ich habe verstanden, was fork() macht und meinem Verständnis nach sollte das Programm immer die gleiche Anzahl an Hello! 's ausgeben.

Kann das an den compile Errors liegen?

Hier der Programmcode:

Code: Alles auswählen

#include <stdio.h>

int main()
{
	int i;
	for(i = 0; i < 2; ++i)
	{
		if(!fork())
		{
			printf("hello!\n");
			fork();
		}
		else fork(); 
	}
}
Anschließend compilieren:

Code: Alles auswählen

./dateiname > ausgabe.txt
Hier meine Compiler-Ausgabe:

Code: Alles auswählen

***@clientssh1:~$ gcc -Wall -o gdi dateiname.c
dateinamec: In function main:
dateinamen.c:7: warning: implicit declaration of function fork
dateinamen.c:14: warning: control reaches end of non-void function
xilef

Christoph-D
Computerversteher
Computerversteher
Beiträge: 325
Registriert: 11. Dez 2005 13:14
Wohnort: Darmstadt

Re: Ü8 H2 fork()????

Beitrag von Christoph-D »

xilef hat geschrieben:ich habe das Programm abgeschrieben und auf den Poolrechnern ausgeführt.

Interssanterweise gibt mir das Programm mal mehr mal weniger hello! aus. Irgendwie steh ich vor einem Rätsel.
Also ich habe verstanden, was fork() macht und meinem Verständnis nach sollte das Programm immer die gleiche Anzahl an Hello! 's ausgeben.

Kann das an den compile Errors liegen?
Die Warnungen lassen sich leicht beheben: Die erste sagt, dass <unistd.h> fehlt (siehe man fork), beim zweiten beschwert sich der Compiler, dass die main-Funktion kein "return" am Ende hat, obwohl sie int zurückgibt. In C++ ist "return 0" bei main nicht nötig, in C schon.

Das Problem mit den fehlenden Zeilen ist IMHO, dass printf nicht multiprozess-sicher ist. Du hast effektiv mehrere Prozesse, die parallel mit printf auf dasselbe stdout-Handle zugreifen wollen. Weil das nicht synchronisiert wird, geht das manchmal schief, und ein paar Zeichen gehen verloren.

Das sieht man bei zwei Prozessen noch deutlicher:

Code: Alles auswählen

#include <stdio.h>
#include <unistd.h>

int main()
{
  int i;
  fork();
  for(i = 0; i < 1000000; ++i)
    printf("hello!\n");
  return 0;
}

Code: Alles auswählen

$ gcc foo.c && ./a.out > ausgabe.txt && wc ausgabe.txt 
 1819776  1819740 12738432 ausgabe.txt
$ gcc foo.c && ./a.out > ausgabe.txt && wc ausgabe.txt 
 1620827  1620803 11345792 ausgabe.txt
$ gcc foo.c && ./a.out > ausgabe.txt && wc ausgabe.txt 
 1913984  1913901 13397888 ausgabe.txt
"I believe in the fundamental interconnectedness of all things." (Dirk Gently)

xilef
Mausschubser
Mausschubser
Beiträge: 48
Registriert: 26. Jan 2008 04:47

Re: Ü8 H2 fork()????

Beitrag von xilef »

Hallo Christoph-D,

vielen Dank für deine schnelle Antwort. Die Fehlerursache habe ich in fehlenden includes vermutet. Danke, dass du mir die entsprechenden Packete genannt hast.

Das bedeutet wir können unsere Ergebnisse, die wir aus dem Zeichnen des Prozessgraphen erhalten nicht validieren?

xilef

xilef
Mausschubser
Mausschubser
Beiträge: 48
Registriert: 26. Jan 2008 04:47

Re: Ü8 H2 fork()????

Beitrag von xilef »

Hallo Christoph-D,

vielen Dank für deine schnelle Antwort. Die Fehlerursache habe ich in fehlenden includes vermutet. Danke, dass du mir die entsprechenden Packete genannt hast.

Das bedeutet wir können unsere Ergebnisse, die wir aus dem Zeichnen des Prozessgraphen erhalten nicht validieren?

xilef

thomas_kalbe
Nerd
Nerd
Beiträge: 570
Registriert: 10. Jun 2006 14:58

Re: Ü8 H2 fork()????

Beitrag von thomas_kalbe »

hm, also ich hab's auf Ubuntu und Suse Linux getestet und es hat funktioniert.
Soweit ich mich erinnere, hab ich es auch auf Cygwin getetstet.
Hast Du das "\n" mit drin?
Oder versuch mal, nach jedem Fork ein fflush, also anstatt

Code: Alles auswählen

printf("Hallo!\n");
fork();
sowas:

Code: Alles auswählen

printf("Hallo!\n");
fflush(stdout);
fork();
-t

xilef
Mausschubser
Mausschubser
Beiträge: 48
Registriert: 26. Jan 2008 04:47

Re: Ü8 H2 fork()????

Beitrag von xilef »

Hallo,
Also ich hatte den Fehler sowohl auf meinem andLinux-System als auch über ssh auf den RBG - Rechnern.

Allerdings behebt der Vorschlag,

Code: Alles auswählen

printf("Hallo!\n");
fflush(stdout);
fork();
-t[/quote]

den Fehler.

Vielen Dank,
xilef

xilef
Mausschubser
Mausschubser
Beiträge: 48
Registriert: 26. Jan 2008 04:47

Re: Ü8 H2 fork()????

Beitrag von xilef »

Hallo,
Also ich hatte den Fehler sowohl auf meinem andLinux-System als auch über ssh auf den RBG - Rechnern.

Allerdings behebt der Vorschlag,

Code: Alles auswählen

printf("Hallo!\n");
fflush(stdout);
fork();
-t
den Fehler.

Vielen Dank,
xilef

Mutalisk
Mausschubser
Mausschubser
Beiträge: 59
Registriert: 10. Okt 2007 12:03

Re: Ü8 H2 fork()????

Beitrag von Mutalisk »

Hier meine Lösung von der 2. b)

printf("10 hello!");
fork();
fork();
fork();

Osterlaus
BSc Spammer
BSc Spammer
Beiträge: 1263
Registriert: 23. Aug 2007 12:46
Wohnort: DA

Re: Ü8 H2 fork()????

Beitrag von Osterlaus »

Mutalisk hat geschrieben:Hier meine Lösung von der 2. b)

printf("10 hello!");
fork();
fork();
fork();
Ich glaube, dass 10 Zeilen mit dem Inhalt "hello!" ausgegeben werden sollen und nicht einmal "10 hello!"

SebFreutel
Computerversteher
Computerversteher
Beiträge: 317
Registriert: 30. Okt 2006 21:54

Re: Ü8 H2 fork()????

Beitrag von SebFreutel »

Osterlaus hat geschrieben:Ich glaube, dass 10 Zeilen mit dem Inhalt "hello!" ausgegeben werden sollen und nicht einmal "10 hello!"
So ist es...

Antworten

Zurück zu „Archiv“