signal oder sigaction mit Parametern?
-
Ich will auf ein
kill -1 <PID>
Signal mit einem einlesen der ConFiles reagieren.
Dazu muss ich natürlich vom SignalHandler Zugriff auf meine Variablen haben.Leider habe ich bis jetzt keine Möglichkeit gefunden wie ich auf die Variablen zugreifen kann ohne die Variablen global zu machen.
Ich würde gerne dem SignalHandler einen Pointer auf meine Daten übergeben, leider scheint es nicht zu gehen.Wie kann ich es am besten machen?
-
hatte nicht gesehen das ich den Handler ja auch in meine Klasse packen kann. Dann geht es natürlich.
Habe ein wenig durch andere Programme gegraped und was gefunden.
-
Kleine Warnung nebenbei: Wenn Du im Signalhandler bist, solltest Du keine großartigen Aktionen durchführen. Du weißt nicht, was das Programm momentan macht. Es kann sein, daß das Programm gerade auf deine Konfiguration zugreift. Wenn Du das dann änderst, kann das zu einem Fehlverhalten (in der Regel Absturz) des Programmes führen.
Sinnvoller ist es, im Signalhandler einfach ein Flag zu setzen und im Hauptprogramm diesen zu überwachen.
Und noch eine Anmerkung: Mutexe helfen hier nicht weiter, da das Hauptprogramm unterbrochen wird und den Mutex nicht frei geben kann, wenn er ihn gerade hält.
-
danke für den Tip. Wollte eh nur ein bool setzen.
Mir ist nur gerade aufgefallen das der Handler static sein muss.(ist ja ein Fkt Pointer).
Ist nun doch etwas mehr arbeit, aber es geht.
-
... und noch 'nen Tipp:
Auch Aufruf von System-Funktionen kann Probleme verursachen. So hat bei mir z.B. eine Kontrollausgabe in eine Datei mit Ausgabe von Datum/Uhrzeit zu Problemen geführt. Irgendeine der diversen Zeit-Calls hatte im Bauch einen impliziten Mutex-Aufruf. Kann wunderbar zur Blockade führen, so dass das Programm komplett stehen bleibt. Z.T. musste auch der komplette Rechner neu gestartet werden, da selbst ein "kill -9" nicht mehr half (Linux FC3). Einige System-Calls mögen noch funktionieren, was aber durchaus von Betriebssystem zu Betriebssystem unterschiedlich sein kann.
Fazit: ALLE System-Calls aus dem Signal-Handler entfernen. Dann ist man auf jeden Fall auf der sicheren Seite!
-
void MyClass::sigHupHandler(int signum) { reReadConfig = true; }
Ich glaube das sollte gehen
Ist eine static Methode.
Danke für die Tips
-
Vorsicht mit der statischen Funktion! Auch das kann gehörig schiefgehen, denn kein Standard schreibt vor, dass ein statisches Mitglied einer Klasse dieselben Aufrufkonventionen haben muss wie globale C- oder C++-Funktionen. Ja es ist nichtmal festgelegt dass eine globale C++-Funktion und eine globale C-Funktion die gleiche Aufrufkonventionen haben müssen. Die einzige 100% zuverlässige Signatur eines Signalhandlers in C++-Code ist demnach
extern "C" void handler(int);
Okay, praktisch gesehen gibt es einige Projekte wo ich das auch schon mit statischen Membern gesehen habe, aber die Möglichkeit besteht dass das mit GCC 5.0 nicht mehr funktioniert
-
Moin Lordy.
So trifft man sich wieder.Das mit den globalen C Funktionen wird auch in allen Beispielen genommen. Leider hätte es eine sehr häßliche Datenstruktur zur Folge.
Bin kein Freund von globalen Variablen.Es läuft zZ ganz gut mit den Statischen Fkts
Das es da hin und wieder Probleme geben kann habe ich auch schon gelesen.
Nun bleibt es aber erstmal so. Habe deinen Hinweiß aber im Code vorgenommen.