Viele viele Fragen!

Disclaimer: Dieser Thread wurde aus dem alten Forum importiert. Daher werden eventuell nicht alle Formatierungen richtig angezeigt. Der ursprüngliche Thread beginnt im zweiten Post dieses Threads.

Viele viele Fragen!
Ich bin im Moment ein bischen verwirrt. Da gibt’s so viele Fragen ! :wand:
1, Was passiert wenn ein Vordergrundprozess termeniert? Der Vaterprozess soll auf das Signal warten und dann gibt den Status vom Kinderprozess aus. Aber was ist mit SIGCHLD-handler? Wird es auch ausgefuehrt? Sollen wir beim Vordergrundprozess das SIGCHLD blockiern? Aber wenn das SIGCHLD blockiert wird, welches bekommt der Vaterprozess bei wait? :motz: Oder vielleicht habe ich was falsch verstanden?

2, Welchen Exit-Status soll beim Terminieren des Hintergrundprozesses ausgegeben werden? Gleich wie Vordergrundprozess oder einfach anhand info->si_code was schreiben?

3, Was sollen wir mit dem Makefile machen, um anzupassen?

Ich gehe schon mal raus und frische Luft kriege…


ich bin nicht sicher ob ich deine fragen richtig verstehe, also
1)

man wait

“[…]The wait function suspends execution of the current process until a child has exited, or until a signal is delivered whose action
is to terminate the current process or to call a signal handling function.[…]”

SIGCHLD bedeutet, das ein kind des prozesses beendet wurde (wenn ich das richtig verstehe). wie der prozess beendet wurde kann man dann mit den macros (man wait) abfragen.
also dürfte es dann wohl witzlos sein, im kindprozess SIGCHLD auf SIG_IGN zu setzen… der prozess hat ja keine kinder, also bekommt er auch nie ein solches signal.
oder meinst du mit blockieren, zu verhindern, dass der (kind-) prozess ein solches signal verursacht? k. a. ob das überhaupt geht…
zur frage “Was passiert wenn ein Vordergrundprozess termeniert?”: versteh da nicht ganz, was du eigentlich wissen willst…

uhm… garkeiner? oder hab ich in der aufgabenstellung was übersehen? der hintergrundprozess läuft im hintergrund, da soll er dann ja auch bleiben, oder, sprich, nicht einfach irgendwas auf das terminal schreiben während z.B. ein anderer prozess läuft oder ich was eintippe.
oder sollen wir, wenn der fg-prozess terminiert auch gleich den exitstatus aller im hintergrund gelaufenen und jetzt “im moment schon” beendeten prozesse mit ausgeben? dann müsste es natüelich (im bezug auf deine frage) für jeden prozess der “eigene” exitstatus sein.


:cry: Ich glaube ich soll mal erklaeren.
1, Wenn der Vaterprozess( shell) einen Vordergrundprozess als Kindprozess hat, muss er warten bis der Kindprozess terminiert und ein SIGCHLD Signal zurueck schickt, dann gibt er den Status vom Kindprozess aus. Aber in unserem shell gibt es eine Handler-funktion fuer SIGCHLD, die eigentlich nur was tut beim Hintergrundprozess. Meine Frage ist, wenn der Vaterprozess ein SIGCHLD Signal vom Vordergrundprozess empfaengt, soll er auch die Handler-funtion ausfuehren?

2, Doch sollen wir den Exit-Status von der Hintergrundprozesse ausgeben. Siehe Teil (f). Ich weiss nur nicht, ob wir einfach “exited”, “stopped”,… ausgeben sollen, oder wie beim Vordergrundprozess, z.B. wie wird der Prozess beendet und die Signalnummer usw. .


ok, damit wir uns richtig verstehen: du beziehst dich auf aufgabe 7f), wo es heißt, wir sollen einen signal-handler für SIGCHLD einrichten, richtig? der wiederum soll dafür sorgen das hintergrundprozesse aus der jobliste ausgetragen werden. und deine frage ist jetzt, was wir mit den vordergrundprozessen machen sollen, richtig?
das ist allerdings eine gute frage :slight_smile: da der handler für SIGCHLD ja im vaterprozess eingerichtet werden muß, wird er doch automatisch aufgerufen, wenn irgendein kind terminier (bzw ein kind ein SIGSTOP, SIGTSTP, SIGTTIN oder SIGTTOU “zugestellt” bekommt). ich seh da jetzt im moment auch keine möglichkeit einen anderen SIGCHLD handler nur für den fg-prozess einzurichten bzw. SIGCHLD wenn es vom fg-prozess kommt zu ignorieren… also um deine frage zu beantworten: ich denk, du hast keine wahl :slight_smile: der SIGCHLD-handler wird wohl einfach ausgeführt. außer natürlich die kombination SIGCHLD-handler/wait unterbindet das irgendwie…

habe ich überlesen :red: : ich denk mal, wir sollen das so machen, wie die shell es bei einem fg-prozess auch tut: Exitstatus [prozess] = # bzw Signal [proz] = #.
aber meine frage: wann sollen wir diesen exitstatus ausgeben? wenn ich grad was eintipp und im hintergrund beendet sich gerade ein prozess will ich doch nicht, dass der mir mitten ins tippen reinblubbert “hey, ich hab mich gerade beendet”…


Das ist die Gretchenfrage bei dieser Aufgabe - da haben wir schon oft und lange drueber diskutiert.

Wie du selber schreibst, will man so ein Reinklatsch-Verhalten eigentlich nicht. Die Alternative waere, erst bei jedem „Enter“ die Zombies einzusammeln. Juk hat dann aber immer gesagt: „Was ist, wenn ich Tausende von Prozessen starte in der Shell, dann in Urlaub fahre und dann gammeln da zwei Wochen lange Tausende von Zombies auf dem System rum, die Ressourcen belegen…“

Fazit: Das Sauberste waere es wohl, die Zombies zu beliebigem Zeitpunkt einzusammeln (SIGCHLD-Handler), die Ausgabe aber solange aufzuheben, bis ein neues Shell-Prompt kommt…


…für die Aufgabe ist die Reinklatsch Variante aber völlig ausreichend!


OT: ich hab leider ohne die aufgabe zu lesen losprogrammiert und eine eigene jobliste verwendet. Nun bin ich fertig und les dass ich doch bitte eure verwenden soll. Kann eure irgendwas total tolles was eine normale liste nicht kann, oder kann ich meine alte behalten?


Bestimmt :]. Aber vor allem hat unsere Liste das herausstechende Feature, dass sie von uns nicht zu korrigiert werden braucht :]. Ein grosser Aufwand duerfte das fuer dich ja nicht sein, das nochmal umzustellen, aber ich kenne das Problem, ich hatte das damals vor zwei Jahren auch so gemacht…


Nun ja, da wir beide am wochenende nicht da sind und ja schon am montag um 10 abgabe ist, werden wir uns schwer tun das nochmal zu ändern.

Aber ich bin mir sicher, dass ihr mit eurer mehrjährigen programmiererfahrung das ganze spielend einfach und schnell korrigieren könnt :wink:


Nu ja - es gehoert ja auch zu den Zielen der Uebung, Euch beizubringen, Aufgabenstellungen zu lesen. In der Klausur koennte das echt relevant werden :wink:

Ich denk’ Euer Uebungsleiter wird Euch da dann halt ein paar Puenktchen fuer abziehen.

Aber ich bin mir sicher, dass Ihr mit eurer programmiererfahrung diesen kleinen Punkteverlust spielend abkoennt :smiley:


Aber nochmal zum eigentlichen Thema: Vorder- vs. Hintergrundprozesse:
Nachdem es immer nur einen Vordergrundprozess geben kann, muss man den nicht in die Joblist
eintragen - man kann ihn sich einfach in einer pid-Variablen bzw. das Kommando in einem
char-Feld merken.

Nun macht es aber nicht viel Sinn, das wait auf die Hintergrundprozesse getrennt zu behandeln.
Wenn man ein wait auf den Vordergrundprozess macht und einer der Hintergrundprozesse stirbt,
dann fliegt man ja auch aus den Vorergrund- wait raus. Wenn man wait (genau gesagt waitpid)
explizit auf die Vordergrundprozess-Id gemacht hat, mit Fehler EINTR und ansonsten bekommt
man die Hintergrund-PID evtl. sogar als Ergebnis des Vordergrund-waits (das haengt davon
ab, ob zuerst der SIGCHLD-Handler angesprungen wird und der sein wait durchbekommt oder
ob zuerst das Vordergrund-wait fertig gemacht wird).

An dieser etwas schwammigen Beschreibung (ich weiss schon, was da wirklich intern
passiert, will das jetzt aber hier nicht ausbreiten) sieht man aber schon, dass es gar nicht
besonders geschickt ist, wenn man getrennte waits fuer Vorder- und Hintergrundprozess macht.
Besser ist, man handelt das wait generell im sigchld-handler ab und legt den Vater bei einem
Vordergrundprozess einfach mit sigpause schlafen. Wenn der daraus aufwacht, gibt’s zwei
Moeglichkeiten: entweder der SIGCHLD-Handler hat den Vordergrundprozess grade mit
wait abgebearbeitet - dann kann er weiterarbeiten - oder der Handler hat einen
Hintergrundprozess abgefertigt - dann koennte er z.B. die exit-Meldung noch ausgeben und
sich dann wieder hinlegen bis der Vordergrundprozess fertig ist.
Die Ausgabe der exit-Meldung im normalen Kontrollfluss des Vaters und nicht im sigchld-handler
hat auch den Vorteil, dass man keinen Aerger mit der evtl. Nebenlaeufaeufigkeit und printf-Aufrufen
bekommt. Man muesste dafuer dann aber in der Joblist im SIGCHLD-handler den Tot und den
grund eintragen und das Entfernen aus der Joblist dann erst nach der Ausgabe machen.

Wenn Ihr die exit-Meldung aber jetzt schon im sigchld-Handler habt, ist das schon auch ok.


unter diesen umständen werden wir natürlich das ganze nochmal gründlich überarbeiten, da ein punkteverlust natürlich unverzeihlich wäre… :moody:

aber mal btw:
Auch wenn ich die erste scheinprüfung bestanden habe darf ich doch auch die zweite mitschreiben und korrigieren lassen ohne dass sie in die wertung eingeht oder?


Ja, du darfst die zweite Miniklausur auch mitschreiben. Korrigieren werden wir sie (leider :)) auch und du brauchst nur eine von beiden zu bestehen.


ja, natuerlich