Moin!
Ich möchte die Signale SIGINT und SIGTERM in meiner Anwendung abfangen, um eine Verbindung zu einer per USB angeschlossenen DAB-Empfängerplatine ordnungsgemäß zu beenden (wichtig, wenn der Pi heruntergefahren wird). Nach ein wenig Lektüre entschied ich mich zunächst für die signal()-Funktion:
#include <signal.h>
void OnSignalCaught (int signal)
{
cout << "Exited." << endl;
exit (signal);
}
int main ()
{
int ret = signal (SIGINT, OnSignalCaught);
if (ret < 0) cout << "Creating signal handler failed! Error code: " << errno << "." << endl;
// Hier kommt der eigentliche Programmcode.
return ret;
}
Alles anzeigen
Kompiliere ich dieses Programm, lasse es laufen und will es mit ^C abbrechen, kommt aber folgende Meldung:
Der Handler wird also schlichtweg ignoriert.
Nun habe ich auf der Manpage von signal() eine Warnung gelesen, man solle bei neuen Projekten eher sigaction() nehmen sollte, und diese Anleitung beherzigt: Tap the interrupt signal Nun schaut die main()-Funktion halt so aus:
int main ()
{
struct sigaction exit_action;
struct sigaction old_action;
int ret;
memset (&exit_action, 0, sizeof (exit_action));
sigemptyset (&exit_action.sa_mask);
sigaddset (&exit_action.sa_mask, SIGTERM);
exit_action.sa_handler = OnSignalCaught;
exit_action.sa_flags = 0;
ret = sigaction (SIGINT, &exit_action, &old_action);
// Hier kommt der eigentliche Programmcode.
return ret;
}
Alles anzeigen
Doch helfen tut das auch nicht: Auf ^C reagiert das Progrämmchen genauso wie vorher. Was mache ich hier nur falsch? Wer weiß das? Danke!