Not logged in. · Lost password · Register

Page:  previous  1  2  3  next 
tsunami
skankin´ foot
Avatar
Member since Jan 2003
352 posts
also ich glaub ich hab da generell was nicht verstanden - bitte helft mir:

Wenn ich einen Hintergrundprozess erzeuge, soll meine trsh doch ausdrücklich NICHT auf diesen warten (waitpid), sondern gleich wieder ein neues Commando einlesen können, also wieder zur main-Funktion zurückehren. Wie bitte schön soll ich all meine Hintergrundprozesse dann wieder auflesen und deren exit-status auslgeben können?
*verzweifel*
  :moody:
once you had a dream
of oceans, and sunken cities;
memories of things you´ve never known
and you have never known...   (Michael Stipe)
This post was edited on 2003-12-14, 15:32 by tsunami.
Steppenwolf
Schläfer
Avatar
Member since Nov 2002
1535 posts
ja, du sollst nicht auf sie warten,
allerdings musst du regelmaessig checken, ob sie gestorben sind und sie dann einsammeln um den exitstatus auszugeben.

anleitung:
  • hintergrundprozesse beim erstellen in die joblist einfuegen
  • diese regelmaessig (du musst dir halt ueberlegen, wann das sinnvoll ist) mit waitpid (NOHANG) auf zombiezustand ueberpruefen
  • ggf. exitstatus ausgeben, wenn gestorben

alles klar?
frahi
Avatar
Member since Nov 2002
777 posts
ein Signalhandler, der die SIGCHLD entgegen nimmt, bietet sich da an um ein waitpid auf Hintergrundprozesse zu machen.
Damit bleiben dann auch keine Zombies uebrig.
Regelmaessiges pruefen nennt man polling bzw. "aktives warten", das ist natuerlich nicht so ideal.

edit: aber bitte nie ein waitpid ohne NOHANG im Signalhandler! Auch Dateioperationen haben da nix verlohren.
This post was edited 2 times, last on 2003-12-14, 21:02 by frahi.
Mikey
SP Team
Avatar
Member since Nov 2002
641 posts
Quote by frahi:
Regelmaessiges pruefen nennt man polling bzw. "aktives warten", das ist natuerlich nicht so ideal.

wenn du es mal programmierst wirst du feststellen dass es nicht so ideal (bzw schoen) ist, wenn dir der signalhandler an beliebigen stellen (zB wenn du gerade ein kommando eingibst) den exitstatus des bg prozesses reinknallt. deshalb finde ich das polling doch die schoenere loesung

(btw >> wann gibt denn die bash den exitstatus aus ;) )
Ford Prefect
Pangalaktischer- Donnergurgler-Trinker
(Administrator)
Avatar
Member since Oct 2002
3298 posts
das sollte kein kriterium sein für polling.

dann doch eher den exitstatus zurückhalten und bei der richtigen gelegenheit ausgeben.
Quote: <mute> mit Miranda macht irc kein spass :P <Loki|muh> dann geh doch wieder :)
<mute> ich benutze kein miranda <Loki|muh> na und? :)
Mikey
SP Team
Avatar
Member since Nov 2002
641 posts
Quote by Ford Prefect:
das sollte kein kriterium sein für polling.
warum denn nicht, bzw was is daran so schrecklich?

Quote by Ford Prefect:
dann doch eher den exitstatus zurückhalten und bei der richtigen gelegenheit ausgeben.
das würde aber einen netten Mehraufwand darstellen der IMHO nicht gerechtfertigt ist

btw was ihr macht ist natürlich euch überlassen auf Schönheit der Ausgabe wird bei der Korrektur keiner schaun
Sebbi
Sensenmännlein
Avatar
Member since Nov 2002
377 posts
Ich würd's auch wie bei der bash machen ... dort wird scheinbar direkt bevor der prompt erscheint auf tote kinder überprüft ...

per signalhandler die kinder aufsammeln und deren exitstatus "an geeigneter stelle" ausgeben ist wenig sinnvoll. Man muss das dann noch extra zwischenspeichern und welche andere Stelle als die oben genannte ist denn noch geeignet? :-)
Repetition is a sign of stupidity. Repetition is a sign of stupidity. Repetition is a sign of stupidity.
Steppenwolf
Schläfer
Avatar
Member since Nov 2002
1535 posts
na sehr gut, ich sammel naemlich die zombies immer erst ein, wenn der benutzer ein return gedrueckt hat. das zaehlt zwar auch als polling, ist aber nicht wirklich ineffizient.

ha, das freut mich jetzt, dass ich auf den signalscheiss verzichten kann.
frahi
Avatar
Member since Nov 2002
777 posts
naja ineffizient ist es nicht, da jedesmal auf Verdacht einen wait zu machen, zumindest vertretbar, weil ja eine Benutzereingabe eh viel laenger dauert.

Ein Problem kann des ganze geben, wenn man nen ganzen Friedhof erzeugt hat und seine Zombies im System rumgeistern, und der Benutzer par tout keine Benuztereingabe mehr macht.
Eine Ausgabe wuerd ich im Signalhandler auch net machen, sondern die Daten in eine globale Struktur uebergeben, dazwischenschreiben ist net grad die feine englische Art.
So machens auch die  ueblichen shells, ich faends aber net tragisch, wenn des jemand mit polling macht.


 :finger:  Auf was ihr aber achten muesst ist, was passiert, wenn die shell abgebrochen wird, da duerfen keine Zombies uebrig bleiben.
This post was edited on 2003-12-15, 22:24 by frahi.
Ford Prefect
Pangalaktischer- Donnergurgler-Trinker
(Administrator)
Avatar
Member since Oct 2002
3298 posts
Mikey: Ich finde nur die Argumentation etwas seltsam, denn ob ich Polling verwende oder nicht damit zu entscheiden, wann ich was ausgeben will...
wenn das Polling auf einen Select hinausläuft, ist es ja prinzipiell in ordnung...
Quote: <mute> mit Miranda macht irc kein spass :P <Loki|muh> dann geh doch wieder :)
<mute> ich benutze kein miranda <Loki|muh> na und? :)
Mikey
SP Team
Avatar
Member since Nov 2002
641 posts
> ok vergesst das in der Aufgabenstellung taucht die Formulierung auf, dass ihr UNMITTELBAR nach terminieren eines Childs den Record schreiben muesst, also wird man um das SIGCHLD nicht rumkommen..
This post was edited 3 times, last on 2003-12-17, 11:10 by Mikey.
Merlin
Member since Nov 2003
4 posts
Also laut WaWi (Christian Wawersich) muss ein SICCHILD-Handler installiert werden, da sonst, wenn ich z.B. 20 Hintergrundprozesse starte, anschliessend den PC fuer 2 Wochen verlasse und wieder zurueck an meine Shell komme 20 Zombies (unter der Voraussetzung, dass ich Polling mache) da sind, die nicht von der Shell aufgelesen worden sind.

Ausserdem machen wir das ganze mit der Jobverwaltung als Liste nur, damit Nebenlaeufigkeit mit ins Spiel kommt, sprich Race-Conditions, die ihr natuerlich geschickt umschiffen sollt.
frahi
Avatar
Member since Nov 2002
777 posts
folgendes Problem kann entstehen, wenn man sich nicht angewoehnt, die Zombies unmittelbar aufzulesen:


frahi@nb2000:/tmp > cat forkbombe.c
int main() {
        while(1){
                if(fork()==0) {
                        exit(1);
                }
        }
}
 
frahi@nb2000:/tmp > ./forkbombe &
[1] 17259
frahi@nb2000:/tmp > ls
-bash: fork: Resource temporarily unavailable
frahi@nb2000:/tmp >
leonidas
Avatar
Member since May 2003
298 posts
Must du forkbombe.c nicht zwischendurch auch kompilieren ?   :-D
Nothing's real until you feel
MeistaJo
Member since Nov 2002
42 posts
Auf den Übungsfolien steht: "Es wird maximal ein Signal zwischengespeichert". Siehe Link, Folie 10.

http://www4.informatik.uni-erlangen.de/Lehre/WS03/V_SP1/Ue…

Laut Übungsleiter und Folie erzeugen also, wenn 4 Kinder gleichzeitig sterben, nur Kind 1 und 2 ein SIGCHILD.
Falls das tatsächlich so ist (ich hab nix in den Manpages dazu gefunden) , ist es mir schleierhaft, wie man die Aufgabe dann sauber mit SIGCHILD Signalhandler lösen soll, wenn man immer damit rechnen muss, dass Signale versickern.
Close Smaller – Larger + Reply to this post:
Verification code: VeriCode Please enter the word from the image into the text field below. (Type the letters only, lower case is okay.)
Smileys: :-) ;-) :-D :-p :blush: :cool: :rolleyes: :huh: :-/ <_< :-( :'( :#: :scared: 8-( :nuts: :-O
Special characters:
Page:  previous  1  2  3  next 
Go to forum
Datenschutz | Kontakt
Powered by the Unclassified NewsBoard software, 20150713-dev, © 2003-2011 by Yves Goergen