Programmieraufgabe Klausur Juli 2001

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.

Programmieraufgabe Klausur Juli 2001
hat jemand Idee ,was im sigchld_handler zu machen


if (ret = wait())&& WIFEXITED(ret)){
	kill(ret);
	numberofchildren--;
             }
errno = errno_bak;

Kann das jemand so ungefähr bestatigen?Ist nicht von mir aber schaut gut aus!? :rolleyes:


Was soll das mit dem errno ?wird da der Wert von errno gespeichert und nach dem Warten und töten des kindes dann wieder der ursprüngliche Wert eingestellt?


jo, genau. „kill“ wird ja, wenn (!) was schiefgeht, den wert von errno verändern, deshalb wird da „errno“ zwischengespeichert. wird wohl am anfang des handlers stehen.
etwa so:

int errno_bak = errno

stimmt!


Ähm, ich weiß ja nicht so recht. Warum braucht man denn ein kill() im sigchld_handler? Hab ich da in den Übungen immer was verpasst? Wird nicht mit wait*() schon alles aufgeräumt?


Warum tötest du ein totes Kind? Soweit ich mich erinnere ist das doch der Signalhandler für SIGCHLD …

jo


das ist ziemlicher Bullshit! Erstens gibt es gar kein kill mit dieser Signatur und zweitens macht es wie gesagt keinen Sinn einem gerade weggeräumten Zombie ein Signal zu schicken. Wenn es denn einen solchen kill Aufruf gäbe würde dieser IMMER fehlschlagen und errno auf ESRCH setzen, da es aber gar keinen kill(pid_t) Aufruf gibt wird schon der Compiler jaulen. Falls der SIGCHLD Handler nichts anderes machen soll als alle Kinder aufsammeln genügt folgendes Codesegment. Ausserdem liest man Zombies im SIGCHLD Handler nicht mit einem wait () auf sondern mit einer waitpid-WNOHANG Schleife, weil man NICHT sicher gehen kann das man für jedes tote Kind ein SIGCHLD bekommt! Vielmehr kann man das SIGCHLD so interpretieren dass MINDESTENS EIN KIND tot ist. Folgendes Codefragment erledigt das auflesen aller vorliegenden Zombies im SIGCHLD Handler

int ebak=errno;
while(waitpid(-1,NULL,WNOHANG)>0);
errno=ebak;

errno sichern schadet in Sighandlern nie, hier kann errno natürlich durch waitpid verändert werden


Aua! Wer hat sich diesen Mist eigentlich ausgedacht?? Was waren das damals Ende der 70er für Psychos? Wurde das heutige Prozess-Management am Ende von übelsten Straftätern erfunden, aus welchen seltsamen Gründen immer? :wand:


leider motzt der compiler da nicht, weil pid_t vom Präprozessor in ein int verwandelt wird, da ist mit
#define pid_t int

in nem header definiert


Abstrakte Sachen überlassen wir immer gern den Informatikern … :smiley:

jo.


das meint der mikey denke ich nicht.
es fehlt halt noch die angabe eines signals:

int kill(pid_t pid, int sig);

aber wie gesagt ist das sowieso totaler quatsch.


tjo, müssen wir das in der klausur dann richtig mit pid_t machen?
ich hab da immer nur int genommen und (soweit ich mich erinnere) auch nie puntkabzug bekommen


jeop das mein ich :wink: Ist ja auch nicht ersichtlich was ret eigentlich für ein Typ ist.

@lopez: wo ist das problem daran pid_t statt int zu verwenden? Dafür wurden diese Typen schließlich eingeführt, eine PID muss ja nicht auf jeder Architektur zwangsläufig ein int sein. Glaube auch nicht dass Dir da Punkte abgezogen werden aber ich sehe keinen Grund sich dagegen zu sträuben mit den Typen zu arbeiten


nene, ich sträub mich ja net. aber ich habe keinen bock in der klausur die manpages zu wälzen um festzustellen, ob überall da wo ich bis jetzt int benutzt habe, vielleicht eigentlich ein sonstwas_t rauskommt.


tja, aber wenn du INT verwendest, ist das prinzipiell FALSCH. und ich würde auch punkte abziehen :wink: wir programmieren hier kein win32 sondern ansi c