Ü8 H2 fork()????

Mspringer
Nerd
Nerd
Beiträge: 555
Registriert: 19. Okt 2006 14:41
Wohnort: Darmstadt / Alzenau
Kontaktdaten:

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

Beitrag von Mspringer »

Ich glaube, die Aufgabe wäre ansonsten wohl auch ein wenig zu einfach ^^

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

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

Beitrag von Mutalisk »

"Modifizieren Sie das Programm so, dass genau 10 hello! ausgegeben werden, ..."


mist, werden und nich wird ;)

Benutzeravatar
Maeher
Sonntagsinformatiker
Sonntagsinformatiker
Beiträge: 282
Registriert: 14. Okt 2007 23:02
Kontaktdaten:

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

Beitrag von Maeher »

Code: Alles auswählen

# include <stdio.h>
int main ( )
{
    int i ;
    for( i = 0 ; i < 10 ; ++ i )
           printf( " hello !\n" );
    fork();
    fork();
    fork();
}
wie wäre es damit? :P

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

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

Beitrag von xilef »

Leider nicht ganz!

Ich denke der Tipp schränkt die Anzahl der Möglichkeiten schon sehr ein...
ach so: das impliziert natürlich, dass man keine Tricks verwendet wie
printf("Hallo!\nHallo!\nHallo!..."); -- das ist hoffentlich klar?

Aber wie gesagt, man kann die Aufg. lösen, ohne eine einzige neue Codezeile hinzuzufügen.

- t
xilef

Benutzeravatar
Maeher
Sonntagsinformatiker
Sonntagsinformatiker
Beiträge: 282
Registriert: 14. Okt 2007 23:02
Kontaktdaten:

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

Beitrag von Maeher »

So erstaunlich es sein mag, es war ein Witz.

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

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

Beitrag von xilef »

Ja das hab ich vermutet...

Wollt nur sicher gehn! ;)

Benutzeravatar
C--
Mausschubser
Mausschubser
Beiträge: 96
Registriert: 2. Okt 2006 15:08
Wohnort: Gelnhausen

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

Beitrag von C-- »

xilef hat geschrieben:Leider nicht ganz!
Ich denke der Tipp schränkt die Anzahl der Möglichkeiten schon sehr ein...
Was zählt ist was auf dem Aufgabenblatt steht, und NICHT was hier im Forum erzählt wird....
Modifizieren Sie das Programm so, dass genau 10 hello! ausgegeben werden, jedoch
ohne weitere printf oder fork hinzuzufügen (d.h. die Gesamtanzahl der printf bzw.
fork muss konstant bleiben).
D.h. Maehers Lösung ist im Sinne der Aufgabe gelöst.
Ich werde doch nicht auch noch anfangen schwammig formulierte Aufgaben zu interpretieren....die Aufgabe wurde sehr frei gestellt und es gibt 1000 möglichkeiten das "künstlerrisch" zu lösen.
Team?
Toll Ein Anderer Machts

levitin
Kernelcompilierer
Kernelcompilierer
Beiträge: 435
Registriert: 7. Okt 2007 15:36
Wohnort: Darmstadt

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

Beitrag von levitin »

ich habe eine Frage zu der Aufabe, und zwar interessant finde ich diese Stelle:

Code: Alles auswählen

if(!fork()){ 
  case1 
}else{ 
  case 2
}
fork() liefert PID des gerade erzeugten Kinderprozesses zurück. Ab dieser Stelle werden jetzt schon 2 Prozesse betrachtet.
das gerade gelieferte PID ist offensichtlich > 0, deswegen geht der Kinderprozess in case1

Warum geht denn der Vaterprozess in case2, also auf else-Zweig? Warum bekommt er denn eine 0 zurück?

würde das Programm das andere Verhalten haben, wenn man diese Stelle wie folgt umschreiben würde? wenn ja, warum?

Code: Alles auswählen

int result = fork(); 
if(result != 0){ 
  case1 
}else{ 
  case 2
}

Steven
Kernelcompilierer
Kernelcompilierer
Beiträge: 425
Registriert: 2. Sep 2008 10:00
Wohnort: Frankfurt am Main

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

Beitrag von Steven »

Der Vaterprozess bekommt die PID des Kindprozesses != 0 zurück. Der "fork()" Befehl wird einmal aufgerufen und kehrt zweimal (einmal im Vaterprozess und einmal im Kindprozess) zurück.

Das zeigt folgendes einfache Testprogramm ganz schön:

Code: Alles auswählen

if (!fork ())
  printf ("Kind");
else
  printf ("Vater");
Dabei erhält man wie erwartet beide Ausgaben.

Dass du den "fork" aus dem "if" herausgezogen hast, ändert erstmal nichts. Du hast aber die Bedingung umgedreht. "if (!fork ())" entspricht einem "if (!result)" bzw. "if (result == 0)". Mir scheint, dass du in deinem Beitrag die beiden cases verwechselt hast.

levitin
Kernelcompilierer
Kernelcompilierer
Beiträge: 435
Registriert: 7. Okt 2007 15:36
Wohnort: Darmstadt

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

Beitrag von levitin »

Steven hat geschrieben:Du hast aber die Bedingung umgedreht.
ups.. ))
Steven hat geschrieben:erhalte wie erwartet beide Ausgaben.
Steven hat geschrieben:Der "fork()" Befehl wird einmal aufgerufen und kehrt zweimal (einmal im Vaterprozess und einmal im Kindprozess) zurück.
das heisst, dass Programm läuft ab dieser Stelle nicht eine Zeile weiter, sonder if-Abfrage wird jezt für beide Prozesse noch mal ausgeführt, aber jetzt nicht mehr mit fork(), sondern mit einer PID, das ausgewertet werden kann?

Steven
Kernelcompilierer
Kernelcompilierer
Beiträge: 425
Registriert: 2. Sep 2008 10:00
Wohnort: Frankfurt am Main

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

Beitrag von Steven »

Eine if-Abfrage "if (a ()) then b(); else c();" wird semantisch betrachtet immer als "int x = a(); if (x) then b(); else c();" ausgeführt. Das Programm braucht zuerst den Rückgabewert von "a()", um dann zu entscheiden, ob der then-Fall oder der else-Fall ausgeführt werden soll. Deshalb macht es auch keinen Unterschied, wenn du dieses implizite Verhalten explizit mit einer Variablen hinschreibst.
levitin hat geschrieben:das heisst, dass Programm läuft ab dieser Stelle nicht eine Zeile weiter, sonder if-Abfrage wird jezt für beide Prozesse noch mal ausgeführt, aber jetzt nicht mehr mit fork(), sondern mit einer PID, das ausgewertet werden kann?
Beide Prozesse laufen ab der Rückkehr des "fork()" Befehls so weiter, als wäre nichts passiert, d.h. beide weisen ihren jeweiligen "fork()" Rückgabewert ihrer jeweiligen Variablen zu (da wir nun zwei Prozesse haben, sind das auch zwei unterschiedliche Variablen). Danach geht es ganz normal weiter im Code, d.h. beide Prozesse führen nun die if-Abfrage aus.

bdb
Erstie
Erstie
Beiträge: 13
Registriert: 11. Feb 2008 19:28
Wohnort: Überall

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

Beitrag von bdb »

Die Begründung in der Mulo für die H2.a ist ein wenig falsch,
es müsste heißen: !fork() ist die kurze Schreibweise für fork() == 0.

richtig?

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

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

Beitrag von thomas_kalbe »

oh, ja!

- t

Antworten

Zurück zu „Archiv“