Daemon: Wie auf TERM/KILL Signal reagieren



  • Hallo.

    Ich habe einen Daemon, der im Kern wie folgt aussieht:

    int main(void) {
    	// MySQL Connect, Init.
    
    	while (true) {
    		// Mach was
    		sleep(60);
    	}
    
    	// MySQL Disconnect, sonstiges Zeug
    
    	return 0;
    }
    

    Meine Frage ist nun, wie kann ich auf das TERM Signal reagieren? Ich möchte in diesem Fall sowohl die while-Schleife beenden (dürfte mit gewissen if-Abfrage und einem "break" gehen), aber auch in dem Falle sofort aus der sleep-Prozedur entfliehen, sodass ich noch zum abschließenden Codeteil komme, bevor die Application zum Stillstand kommt.

    PS: In Linux verwende ich den Befehl "kill <pid>", um den Prozess zu beenden.

    Gruß
    blackdrake





  • Die Antworten hier sind aber kurz und ernüchternd für einen Anfänger, der eine konkrete Frage stellt ... 😕

    So wie ich das jetzt auf die schnelle gelesen habe, kann ich mit signal() das zuletzt empfangene Signal abrufen.

    Das würde dann heißen, ich könnte sowas in der Art machen, wie etwa:

    if (signal() == SIG_TERM) break;
    

    Ohne das jetzt im Moment weiter zu vertiefen, wurde meine Frage ja nicht beantwortet.

    Nach jedem Durchlauf schläft der Daemon 60 Sekunden. Wie soll ich ein Signal abfragen, wenn doch die aktuelle Sleep-Funktion noch nichts macht. Ich muss ja auf das TERM Signal innerhalb von wenigen Sekunden antworten, bevor automatisch ein KILL folgt und die Prozesstruktur gelöscht wird.

    Gruß
    blackdrake



  • glaub ich nicht. lies nochmal ne andere seite zu signal.



  • #include <signal.h>
    
    void catch_funktion(int sig)
    {
      // do something when the signal was caught
    }
    
    int main()
    {
      signal(SIGINT, catch_funktion);
      // do something in your program
    }
    

    hoffe das prinzip ist verständlich 😉
    Um es nochmals kurz zu erläutern: du erstellst eine funktion die das signal abfangen soll, und in dieser funktion machste dann etwas ganz tolles (wie z.B. eine globale variable auf false setzen, damit sich deine endlosschleife beendet)
    Dann musst du das Signal, was du abfangen möchtest mit deiner catch-funktion verbinden (via signal(SIGNALTYPE, Your_catch_funktion)).
    Das wars auch schon...
    Du kannst auch mehrere signale mit der selben funktion verbinden, dann kannst du auch etwas mit dem int sig in der Funktion anfangen...



  • man sollte in neuen anwendungen sigaction verwenden und auf signal verzichten.
    sleep wird abgebrochen, sobald ein signal ankommt, das nicht ignoriert wurde.
    das KILL signal kannst du in der anwendung nicht abfangen.


Anmelden zum Antworten