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.
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:
Ä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?
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:
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 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.