Inhaltsverzeichnis
3. Verzögerung im Millisekundenbereich
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: