Signal kommt nicht an
-
Sanfte Grüße, ich hätt da gern mal ein Problem. Mir war kürzlich ein wenig langweilig, was mich dazu getrieben hat ein lustiges kleines Programm zu schreiben um User zu ärgern ^^ genau gesagt, eine Kopie des historischen "Robin Hood"
Heraus kam am ende das hier:
#include <stdio.h> #include <signal.h> #include <string.h> #include <sys/types.h> #include <sys/wait.h> #include "stdlib.h" #include <sys/ipc.h> //einfach mal alles rein ^^ void murder(int); char *name[2] = { "Robin Hood", "Friar Tuck" }; char *nick[2] = { "Robin", "Tuck" }; int robin; // 1 = Robin, 0 = Tuck int fpid; // PID des Freundes void distress(int sig) //Handler für das Killsignal { printf("%s: %s... I am under attack! Pray save me!\n", name[robin], nick[1 - robin]); kill(fpid,SIGHUP); //Signal an Freund, ruft dort rescue auf exit(0); } void rescue()//Freund ist gestorben, neuen Forken { int fpid = fork(); if(fpid == 0) // wir sind der Neue { if(robin) { robin = 0; } else { robin = 1; } fpid =getppid(); printf("%s: Thank you, my good fellow! [%d]\n", name[robin],getpid()); } } void murder(int sig)//Handler für Hilferuf des Freundes { printf("%s: Fear not, friend %s!I shall rout the Sheriff of Nottingham's men!\n", name[robin], nick[1 - robin]); rescue(); } int main(void) { int status; signal(SIGTERM, distress); signal(SIGHUP, murder); if(fork()) { return;//Daemonisierung } else { fpid = fork(); if(fpid) { robin=1; } else { robin=0; fpid =getppid(); } } printf("%s: Greetings, %s! [%d]\n", name[robin], nick[1 - robin], fpid); while(1) { sleep(1); //You will not die *hrhr* } return; }Das Konstrukt funktioniert Wunderbar... genau einmal

ausgabe:bash-3.00$ Friar Tuck: Greetings, Robin! [17764] Robin Hood: Greetings, Tuck! [5836] kill 17764 Robin Hood: Tuck... I am under attack! Pray save me! Friar Tuck: Fear not, friend Robin!I shall rout the Sheriff of Nottingham's men! bash-3.00$ Robin Hood: Thank you, my good fellow! [7144] kill 7144 Robin Hood: Tuck... I am under attack! Pray save me! bash-3.00$ kill 5836 Friar Tuck: Robin... I am under attack! Pray save me!egal in welcher Konstellation, nach der ersten "Rettung" reagiert das Programm nicht mehr auf den Hilferuf, manuelle SIGHUPs werden korrekt abgehandelt, kann mir irgendwer helfen ? nicht dass es wichtig wäre, aber das wurmt mich ^^
-
Hallo,
dein Problem ist die rescue function. In Zeile 30 erzeugst du eine
lokale Variable fpid, in der du die PID des Childs speicherst. Da die
Variable lokal ist, geht ihr Inhalt am Ende der Funktion verloren, so
dass der zweite Aufruf fehl schlägt.Versuchs mal hiermit:
void rescue()/*Freund ist gestorben, neuen Forken */ { int pid = fork(); if (pid == 0) {/* wir sind der Neue */ if(robin) robin = 0; else robin = 1; fpid = getppid(); printf("%s: Thank you, my good fellow! [%d]\n", name[robin],getpid()); } else { fpid = pid; } }Gruß mcr
PS: das soll jetzt nicht heißen, dass ich Leute ärgern ok finde!
-
Was zum [censored] ^^ ich hab ewig nach sowas gesucht, aber natürlich überprüf ich ob die PIDs korrekt gesetzt sind in der rescue, dickes merci ^^
funktioniert perfekt. dann mach ich mich mal dran in die Endlosschleife n waitpid zu basteln, damits auch Signal 9 übersteht *tüddel*
-
Es läuft, es überlebt ein Signal neun *hrhr* (Der Sohn forkt wenn seine ppid eins wird, und der Vater hört auf waitpid)
Nun schlägt aber ein Problem zu, das ich mangels Erfahrung mit Daemons nicht ergründen kann: Alle funktioniert wunderbar, solang die Shell offen ist. Wird diese geschlossen, und Robin oder Tuck versuchen etwas zu schreiben entstehen plötzlich viele (aber seltsamerweise endlich viele) Threads, alle als "Waiting for output" geflaggt.
Nun wäre die Frage:
-Was tut ein Prozess wenn der stdout wie in diesem Fall nicht erreichbar ist ?
(Ich möcht nachvollziehen woher die vielen Kindprozesse kommen)
-Kann ich diesen Fehler abfangen, also printf nur wenn shell noch offen ?
-Oder noch besser: kann ich in dem Fall eine neue Shell öffnen und die printfs dorthin umlenken ? (Das wär an sich ein schöner "schadcode" ]=) alle zwei Minuten geht eine Shell auf, in der die beiden Prozesse ein paar Zeilen miteinander reden)Ich weiß 0=) erst Dämonisieren, und dann doch ne Shellbindung verlangen ist... nennen wir es seltsam, aber die Reaktion einiger Leute würd ich zu gern sehen.
-
Keiner was dazu zu sagen ?
Schade... wenn ich die Erreichbarkeit der Shell nicht sicherstellen kann fällt mir nämlich ehrlich kein Weg ein wie die Programme sich zu Wort melden können... kann doch net sein dass das alles ein Fehlschlag war.
-
Ich weiß zwar jetzt nicht so genau wie, aber eine Idee wäre doch die folgende:
-- Du öffnest für jede Meldung ein eigenes Fenster und schreibst dort
deine Nachricht rein.Gruß mcr