Ich möchte einen Timer starten und eine Funktion aufgerufen haben, wenn sie abläuft.Muss ich einen Signal-Handler für einen Posix-Timer verwenden?
Googling findet viele Beispiele, einschließlich des Beispiels im Handbuch, die alle sigaction()
verwenden, um einen Signalhandler zu setzen.
Jedoch sagt @Patryk in this question, die wir
void cbf(union sigval);
struct sigevent sev;
timer_t timer;
sev.sigev_notify = SIGEV_THREAD;
sev.sigev_notify_function = cbf; //this function will be called when timer expires
sev.sigev_value.sival_ptr = (void*) arg;//this argument will be passed to cbf
timer_create(CLOCK_MONOTONIC, &sev, &timer);
können, die kürzer, einfacher, sauberer, besser verwaltbar ...
Was soll das? Ist das richtig? Ist es nur ein Wrapper für sigaction()
? Warum setzen die Beispiele explizit einen Signal-Handler?
Wenn ich einen Timer entweder durch diese Methode oder durch timer_settime
und einen Signalhandler starte, wird das Abbrechen des Timers das System veranlassen, die Zuordnung zwischen diesem Timer und dem Rückruf zu entfernen, oder muss ich das explizit tun ?
[Update] Sie können wählen, entweder Signale der Methode, die ich in meiner Antwort unten zeigen (oder beides, aber das scheint dumm). Es ist Geschmackssache. Singals könnten ein bisschen mehr Funktionalität bieten, auf Kosten der Komplizentierung.
Wenn Sie nur einen Timer starten und benachrichtigt werden möchten, wenn er abläuft, ist die Methode in meiner Antwort am einfachsten.
Ich denke, die Entscheidung, zwischen Threads oder Signalen als zugrundeliegende Benachrichtigungsschnittstelle für POSIX-Timer zu wählen, hängt vollständig von (auf Meinungen) ab, ob Sie bereit sind, Threads (aus welchen Gründen auch immer) für Ihre Anwendung zu verwenden Sie nicht, Sie sind gezwungen, das Thread-Benachrichtigungssystem aufgrund der Signalschnittstelle zu verwenden, die aus irgendeinem Grund keine Option ist (aus welchem Grund auch immer ... ein guter Grund mag der Einfachheit halber sein). – pah