Drei einfache Möglichkeiten, Timer unter Linux zu implementieren

Inhaltsverzeichnis

1. sleep() und usleep()

1.sleep()

2.usleep()

3. Verzögerung im Millisekundenbereich

2. Signal und Alarm()

3. auswählen

4. Einige Schlussfolgerungen


1. sleep() und usleep()

        Der Vorteil besteht darin, dass es einfach und bequem ist und direkt aufgerufen werden kann. Der Nachteil liegt jedoch auch auf der Hand: Die Genauigkeit reicht nicht aus, insbesondere wenn die Systemlast relativ groß ist, tritt ein Timeout-Phänomen auf.

1.sleep()

#include <unistd.h>

unsigned int sleep(unsigned int seconds);

Funktion: Die Ausführung wird für die angegebene Anzahl von Sekunden angehalten

        sleep() kann nur bis zur zweiten Ebene genau sein. Sleep() ist kein Systemaufruf und Sleep() ist in einer Bibliotheksfunktion implementiert. Es verwendet alarm(), um die Alarmzeit festzulegen, und verwendet sigsuspend(), um den Prozess beim Signal SIGALARM anzuhalten. sleep() unterbricht den aktuellen Prozess, bis die durch den Parameter Sekunden angegebene Zeit erreicht ist oder er durch ein Signal unterbrochen wird.

2.usleep()

#include <unistd.h>

void usleep(int micro_seconds);

Funktion: Unterbrechen Sie den Prozess für einen bestimmten Zeitraum. Die Einheit ist Mikrosekunden (ein Millionstel).

        Die Verwendung ähnelt der Funktion „sleep()“, außer dass die Zeiteinheit Mikrosekunden ist. Aber die Implementierung ist unterschiedlich, Sleep wird mit Alarm implementiert, daher ist die Zeiteinheit s, und die Zeiteinheit von usleep ist us, es wird definitiv nicht durch Alarm implementiert, daher sind ihre Implementierungen unterschiedlich, aber sie werden alle von Linux verwendet. und window Es kann nicht unter verwendet werden, da sowohl Sleep als auch Usleep unter unistd.h definiert sind.

        Wenn die Verzögerungszeit in der Größenordnung von Sekunden liegt, verwenden Sie im Allgemeinen so oft wie möglich die Funktion „sleep()“. Wenn die Verzögerungszeit mehrere zehn Millisekunden (1 ms = 1000 us) oder weniger beträgt, verwenden Sie so oft wie möglich die Funktion usleep(). Nur so kann die CPU-Zeit optimal ausgenutzt werden.

3. Verzögerung im Millisekundenbereich

        Da es unter Linux keine vorgefertigte Verzögerung auf Millisekundenebene gibt, können wir hier einfach selbst eine schreiben:

#include <unistd.h>

void msleep(unsigned long     ms)
{
    struct timeval        tv;
    tv.tv_sec = ms/1000;
    tv.tv_usec = (ms%1000)*1000;

    select(0, NULL, NULL, NULL, &tv);
}

2. Signal und Alarm()

        Verwenden Sie die Signalfunktion, um die Verarbeitungsfunktion von SIGALRM festzulegen, und verwenden Sie dann alarm (), um SIGALRM regelmäßig zu senden, um dies zu erreichen.  

#include <stdio.h>
#include <signal.h>
#include <unistd.h>

int alarm_flag=1;

void timer(int sig)
{
    if(SIGALRM == sig)
    {
        alarm_flag = 1;
    }
    return;
}

int main()
{
    signal(SIGALRM, timer);
    
    while( alrm_flag )
    {
        alarm_flag = 0;

        printf("hello\n");
        alarm(5);
     }

    return 0;
}

#include <unistd.h>

unsigned int alarm(unsigned int seconds);        

Funktion: Signalübertragungswecker einstellen

        alarm () wird auch als Weckerfunktion bezeichnet. Die Hauptfunktion der Funktion alarm () besteht darin, den Signalübertragungswecker einzustellen, dh das Signal SIGALRM festzulegen, das nach Ablauf der Anzahl der Sekunden an den aktuellen Prozess gesendet werden soll durch den Parameter Sekunden. Wenn die Verarbeitungsfunktion des Signals SIGALARM nicht eingestellt ist, beendet alarm() den Prozess standardmäßig. Wenn der Parameter Sekunden den Wert 0 hat, wird der zuvor eingestellte Wecker abgebrochen und die verbleibende Zeit zurückgegeben.

        PS: Ein Prozess kann nur eine Alarmzeit haben. Wenn die Alarmzeit vor dem Aufrufen des Alarms eingestellt wurde, wird jede vorherige Alarmzeit durch den neuen Wert ersetzt.

3. auswählen

#include <sys/select.h>

#include <sys/time.h>

#include <sys/types.h>

#include <unistd.h>

int select(int n, fd_set *readfds, fd_set *writefds, fd_set *exclusfds, struct timeval * timeout);

Funktion: Wird verwendet, um auf die Statusänderung des Dateideskriptors zu warten. Der Parameter n stellt den größten Dateideskriptor plus 1 dar, und die Parameter readfds, writefds und außerfds werden als Deskriptorgruppen bezeichnet, mit denen der Lese-, Schreib- oder Ausnahmestatus des Deskriptors zurückgegeben wird.

         Die Parameter und Funktionen der Auswahlfunktion werden hier nicht im Detail vorgestellt. Sie können sie bei Interesse ausprobieren. Wenn Sie hier einen Timer implementieren möchten, setzen Sie den ersten Parameter auf 0, die mittleren drei Dateideskriptorsätze auf NULL und den fünften Parameter ist die Zeitstruktur. Wir verwenden hauptsächlich den Parameter und setzen ihn auf die gewünschte Timing-Frequenz Bußgeld.

        timeout ist die Struktur timeval, mit der die Wartezeit von select () festgelegt wird, und ihre Struktur ist wie folgt definiert:

struct timeval

{

        time_t tv_sec;

        time_t tv_usec;
};

#include <sys/select.h>
#include <sys/time.h>
#include <sys/types.h>
#include <unistd.h>

void timer_s(unsigned long    s, unsigned long     us)
{
    struct timeval        tv;

    tv.tv_sec = s;
    tv.tv_usec = us;

    select(0, NULL, NULL, NULL, &tv);
}

int main()
{
    while(1)
    {
        printf("hello\n");
        timer_s(3, 0);
    }

    return 0;
}

4. Einige Schlussfolgerungen

        Jeder wählt nach seinen eigenen Bedürfnissen. Dies ist ein Bild aus dem Internet. Der Link zum Originaltext lautet wie folgt:

Verschiedene Schlafmethoden für Sleep, Usleep, Nanosleep, Poll und Select unter Linux https://mp.weixin.qq.com/s?src=11×tamp=1680196399&ver=4438&signature=LzDVJT7uLU7DuxA6qxK8Sm4FqjJw8G347mhB56nkDIb5R2XQs ifqz-NFi1nmisd VYxrrRNgLVKIJqjN4koJ59oTtTBWunbaWVMV7u6dNydmBRf-DA9aR6yVNKkbJF*oI&new=1

Supongo que te gusta

Origin blog.csdn.net/qq_51368339/article/details/129870386
Recomendado
Clasificación