Archiv verlassen und diese Seite im Standarddesign anzeigen : korrekte umleitung von ausgaben
lokicall
27-01-2006, 09:58
Hallo,
ich habe folgendes Problem, dass meine Ausgaben nicht mit den Ausgaben in der Umleitung übereinstimmen.
#include <stdio.h>
int main()
{
int a,b;
printf("AUSGABE1\n");
a=fork();
b=fork();
printf("AUSGABE2\n");
if(a==0)
{
printf("AUSGABE3\n");
b=fork();
printf("AUSGABE4\n");
}
printf("AUSGABE5\n");
printf("Wert von a: %d b: %d\n",a,b);
}
Weder prog > ausgabe noch prog >> ausgabe liefert das gewünschte Ergebnis. Keine Ahnung was intern für eine Reihenfolge genutzt wird. Zur Erläuterung fork erzeugt einen neuen Prozess durch Verdopplung.
Welche Ausgabe erwartest Du denn?
Edit: Durch fork() hast Du ja bekanntlich mehrere Prozesse. Wann allerdings welcher Prozess in welcher Reihenfolge dran ist, kann nicht ganz bestimmt werden. Das macht der Scheduler. Und das kann jedesmal anders sein.
lokicall
27-01-2006, 11:32
Sobald fork aufgerufen wird, wird der Kindprozess gestartet. Innerhalb dessen hat der Prozess die pid=0, der Elternprozess bekommt dann die richtige PID vom BS.Die Reihenfolge ist aber immer die selbe, nämlich nachdem fork aufgerufen wurde wird der Kindprozess weiter ausgeführt,an der Stelle wo er zuletzt war ein Befehl weiter, bis er von selber endet. Danach gehts weiter mit dem Elternprozess. Es entsteht ein Aufrufsbaum, durch die Rekursion. Aber die Reihenfolge der Ausgaben auf dem Terminal stimmen nicht überein mit denen der Umleitung. Wieso?
peschmae
27-01-2006, 15:04
... Kindprozess weiter ausgeführt,an der Stelle wo er zuletzt war ein Befehl weiter, bis er von selber endet. Danach gehts weiter mit dem Elternprozess.
Nicht danach sondern "gleichzeitig" d.h. in der Praxis vor allem recht durcheinander wies dem Kernel gerade gefällt. Wenns danach wäre würds ja gar nichts bringen dass du forkt - dann könntest du ja genau so gut einfach einen Prozess nutzen und gut - wie Caveman schon gesagt hat.
MfG Peschmä
lokicall
27-01-2006, 16:04
Jetzt versteh ich garnichts mehr. Also das würde heißen, wenn ein Kindprozess abstirbt, dass der Elternprozess weiterlaufen kann und sich dann selbst beenden. Zum anderen wäre die Ausgabe nicht konstant dieselbe!!!
Wäre das so wie du das beschrieben hast wären alle Ausgaben von a bis auf eine !=0 richtig, aber 2 Ausgaben sind !=0. Der Startprozess und der von fork in (a==0) .
Ich hab die Lösung gefunden. Die Pufferung von Daten aus Performancegründen war das Problem. Siehe http://www.pronix.de/pronix-152.html
peschmae
27-01-2006, 18:25
Naja ich versteh auch nix - vor allem dein erstes Posting nicht offenbar :D
Aber wieso sollte der Elternprozess nicht weiterlaufen wenn der Kindprozess gestorben ist? Ich meine wenn der Elternprozess das nicht könnte würde sich init beim ersten Prozess der sich beendet auch beenden und es würde gar nix mehr laufen...
MfG Peschmä
locus vivendi
27-01-2006, 18:48
Ich hab die Lösung gefunden. Die Pufferung von Daten aus Performancegründen war das Problem. Siehe http://www.pronix.de/pronix-152.html
Das kommt mir sehr dubios vor, auch deine Quelle. Höchstwahrscheinlich verstärkt die Pufferung die du ansprichst nur die Symptome deines Problems. Auch ohne Pufferung wirst du das Problem noch haben, bloß das du es nicht so deutlich siehst. Ich kann mir dessen nicht ganz sicher sein, aber alles was du schreibst, hört sich stark danach an.
lokicall
27-01-2006, 20:12
Tipp doch einfach mal den Code ab und starte das Programm. Vergleiche mal die Ausgabe auf den Terminal mit denen in deiner Datei. Z.B. Umleitung via prog > ausgabe . Beide Ausgaben unterscheiden sich!
Zum -2 Antwort:
Die Ausgaben geben mir recht. Es sollte bei paralleler Ausführung & ständigen Taskwechsel nur einmal PID des Elternprozess a!=0 sein, da der Elternprozess früher beendet wird als all seine Kindprozesse. Sobald fork aufgerufen wird, wechselt das BS zu den Kindprozess und Elternprozess wartet bis Ende des Kindprozess, anderfalls wäre alle Ausgaben durcheinander.
peschmae
27-01-2006, 21:15
Die Ausgaben geben mir recht.
Was war denn deine Aussage die damit unterstützt wird?
Es sollte bei paralleler Ausführung & ständigen Taskwechsel nur einmal PID des Elternprozess a!=0 sein, da der Elternprozess früher beendet wird als all seine Kindprozesse.
Nein, der Elternprozess muss nicht früher beendet werden. Das kommt drauf an was der Kernel gerade meint wer jetzt wieviel Rechenzeit bekommt.
Sobald fork aufgerufen wird, wechselt das BS zu den Kindprozess und Elternprozess wartet bis Ende des Kindprozess, anderfalls wäre alle Ausgaben durcheinander.
Was genau das BS wann macht ist seine Sache - bei Fork wird erst mal der Prozess kopiert. Aber wer nachher zuerst ausgeführt wird von den beiden das ist nicht vorhersehbar - wenn du eine SMP Maschine hast laufen die u.U. gleichzeitig.
MfG Peschmä
locus vivendi
27-01-2006, 21:30
Tipp doch einfach mal den Code ab und starte das Programm. Vergleiche mal die Ausgabe auf den Terminal mit denen in deiner Datei. Z.B. Umleitung via prog > ausgabe . Beide Ausgaben unterscheiden sich!
Ja, sicher, das kann durchaus sein. Es hat auch niemand behauptet, dass die Ausgabe gleich sein würde. Aber das bedeutet nicht, dass die Ausgabe auf der Konsole immer die gleiche wäre. Um das klarzustellen: Wenn du das Programm auf der Konsole, ohne Umleitung, mehrmals hintereinander startest, kann sich die Ausgabe auch von Mal zu Mal unterscheiden. Und bei mir tut sie das auch tatsächlich.
Die Ausgaben geben mir recht. Es sollte bei paralleler Ausführung & ständigen Taskwechsel nur einmal PID des Elternprozess a!=0 sein, da der Elternprozess früher beendet wird als all seine Kindprozesse. Sobald fork aufgerufen wird, wechselt das BS zu den Kindprozess und Elternprozess wartet bis Ende des Kindprozess, anderfalls wäre alle Ausgaben durcheinander.
Daran ist jeder einzelne Satz falsch.
lokicall
27-01-2006, 22:08
Stimmt, jetzt merke ich das auch. 2 unterschiedliche Ausgaben. Nun habe ich das Problem, die Aufgabe war Teil einer Betriebssysteme Prüfung. Man soll dabei alle Ausgaben aufschreiben. Dann kann man ja nur die Anzahl der Ausgaben und ein paar Eckpunkte hinschreiben, da der Rest Kernel abhängig ist.
peschmae
28-01-2006, 09:01
Ja, genau.
Mehr als dass
printf("AUSGABE1\n"); zuerst kommt und dann ein
printf("AUSGABE2\n"); kannst du nicht sagen.
Das ist auch genau der Sinn von fork bzw. mehreren Prozessen - die laufen unabhängig voneinander.
MfG Peschmä
Ich versuche es mal:
1x Ausgabe1
4x Ausgabe2
2x Ausgabe3
4x Ausgabe4
6x Ausgabe5
aus der letzten Zeile im Programm:
Wert a: PID b: PID
Wert a: PID b: 0
2x Wert a: 0 b: 0
Wert a: 0 b: PID
Wert a: 0 b: PID
Andere Vorschläge?
Tröste Dich lokicall, ich hab letztes Semester Betriebssysteme nur ganz knapp geschafft.
lokicall
28-01-2006, 10:56
Habs zum Glück noch vor mir . Ich kann zwar alles benutzen ausser alte Klausuren, doch mein Skript, nein besser Foliensatz, ist unverständlich ohne Struktur und Erläuterungen und die Vorlesung war grausam monoton. Und in 60min hab ich da nicht so viel Zeit da mal reinzuschauen, wenn alle Aufgaben so formuliert werden, wirds richtig lustig:D .
Na dann, viel Spaß.
Unsere Vorlesung war zwar auch sehr monoton, dafür war aber das Skript Spitzenklasse.
Und wir hatten 90min Prüfung.
Powered by vBulletin® Version 4.2.5 Copyright ©2025 Adduco Digital e.K. und vBulletin Solutions, Inc. Alle Rechte vorbehalten.