C-Programmierung

So verwenden Sie SIGALRM und die Alarmfunktion in der Sprache C?

So verwenden Sie SIGALRM und die Alarmfunktion in der Sprache C?
Das Alarm() Funktion wird verwendet, um a . zu erzeugen SIGALRM Signal nach Ablauf einer bestimmten Zeit. In diesem Artikel zeigen wir Ihnen, wie Sie es verwenden Alarm() Funktion und SIGALRM Signal unter Linux. Also lasst uns anfangen.

Syntax

unsigned int alarm (unsigned int sekunden)

Die Funktion ist definiert in unistd.ha Header-Datei.

Argumente

Die Funktion benötigt ein Argument, Sekunden. Nach dem Sekunden Sekunden sind seit der Anforderung des Alarm() Funktion, die SIGALRM Signal wird erzeugt. Das Standardverhalten beim Empfang von SIGALRM ist, den Prozess zu beenden. Aber wir können das Signal einfangen und verarbeiten. Siehe Signalhandhabungsdetails.

Das Alarm() Die Funktion gibt einen Wert ungleich Null zurück, wenn zuvor ein anderer Alarm eingestellt wurde und der Wert die Anzahl der Sekunden ist, die für den vorherigen geplanten Alarm aufgrund der Lieferung verbleiben. Andernfalls Alarm() wird null zurückgeben.

Beispiel 1.c:

#einschließen
#einschließen
#einschließen
 
void sig_handler(int signum)
 
printf("Innere Handler-Funktion\n");

 
int main()
 
signal(SIGALRM,sig_handler); // Signalhandler registrieren
 
Alarm (2); // Geplanter Alarm nach 2 Sekunden
 
for(int i=1;;i++)
 
printf("%d : Innerhalb der Hauptfunktion\n",i);
Schlaf (1); // Verzögerung für 1 Sekunde

0 zurückgeben;

Im Screenshot der Ausgabe von Beispiel 1.c, Das Programm wird mit dem Befehl time ausgeführt, damit wir uns einen Überblick über die Ausführungszeit des Programms verschaffen können. Wir haben beobachtet, dass wir in der Hauptfunktion Alarm() Funktion, geplant für 2 Sekunden. Also, die for-Schleife wird ausgeführt, nach 2 Sekunden wird die sig_handler-Funktion aufgerufen und die Ausführung der Hauptfunktion wird angehalten. Nach Ausführung der sig_handler-Funktion wird die Hauptfunktion für die Schleifenausführung wieder aufgenommen. Hier verwenden wir die Schlaffunktion zum Verzögern, damit wir den Ablauf der Ausführung verstehen können. Die for-Schleife ist eine Endlosschleife, wenn wir eine Unterbrechungstaste (Strg+C) drücken, wird die Ausführung beendet.

Erstellen SIGALRM mit Signal() Funktion kann nicht gestapelt werden. Einziger SIGALRM Generation kann geplant werden. Aufeinanderfolgende Anrufe von Signal() Funktion den Wecker des aufrufenden Prozesses zurücksetzen.

Beispiel2.c:

#einschließen
#einschließen
#einschließen
 
void sig_handler(int signum)
 
printf("Innere Handler-Funktion\n");

 
int main()
 
signal(SIGALRM,sig_handler); // Signalhandler registrieren
 
Alarm (4); // Geplanter Alarm nach 4 Sekunden
Alarm (1); // Geplanter Alarm nach 1 Sekunde
 
for(int i=1;;i++)
 
printf("%d : Innerhalb der Hauptfunktion\n",i);
Schlaf (1); // Verzögerung für 1 Sekunde

 
0 zurückgeben;

Im Screenshot der Ausgabe von Beispiel2.c, Wir können sehen, dass das Programm länger als 7 Sekunden ausgeführt wurde, aber der erste Alarm, der nach 4 Sekunden geplant war, ruft die Handler-Funktion nicht auf. Der zweite Alarm, der nach 1 Sekunde geplant wurde, wird den Alarm zurückgesetzt.

Wenn der Wert des Arguments Sekunden Null ist, wird jede zuvor gestellte Alarmanforderung abgebrochen.

Beispiel3.c:

#einschließen
#einschließen
#einschließen
 
void sig_handler(int signum)
 
printf("Innere Handler-Funktion\n");

 
int main()
 
signal(SIGALRM,sig_handler); // Signalhandler registrieren
 
Alarm (2); // Geplanter Alarm nach 2 Sekunden
Alarm(0); // Den vorherigen Alarm abgebrochen
 
for(int i=1;;i++)
 
printf("%d : Innerhalb der Hauptfunktion\n",i);
Schlaf (1); // Verzögerung für 1 Sekunde

 
0 zurückgeben;

Im Screenshot der Ausgabe von Beispiel3.c, Wir können sehen, dass der erste Alarm, der nach 2 Sekunden geplant war, wegen des zweiten Alarms für 0 Sekunden abgebrochen wird.

Im Beispiel4.c wir werden sehen, wie kontinuierlich wir alle 2 Sekunden einen Alarm einstellen können.

Beispiel4.c:

#einschließen
#einschließen
#einschließen
 
void sig_handler(int signum)
 
printf("Innere Handler-Funktion\n");
 
Alarm (2); // Planen Sie einen neuen Alarm nach 2 Sekunden

 
int main()
 
signal(SIGALRM,sig_handler); // Signalhandler registrieren
 
Alarm (2); // Planen Sie den ersten Alarm nach 2 Sekunden
 
for(int i=1;;i++)
 
printf("%d : Innerhalb der Hauptfunktion\n",i);
Pause(); // warten, bis das Signal verarbeitet wird

 
0 zurückgeben;

Im Screenshot der Ausgabe von Beispiel4.c, Wir können sehen, dass der Alarm alle 2 Sekunden kontinuierlich ist. Wir setzen den Alarm in der sig_handler-Funktion zurück.

Im Beispiel5.c wir werden sehen, wie wir den bereits geplanten Alarm verzögern können. Wir verwenden das SIGINT-Signal für Interrupt. Wenn der Benutzer Strg+C in die Tastatur eingibt, UNTERSCHRIFT Signal wird erzeugt.

Beispiel5.c:

#einschließen
#einschließen
#einschließen
 
void sig_handler(int signum)
 
if(signum == SIGALRM)         //Signalhandler für SIGALRM
 
printf("Innere Handlerfunktion für SIGALRM\n");
Alarm (2);

if(signum == SIGINT)         // Signalhandler für SIGINT
printf("\nSnoozing für 5 Sekunden… \n");
Alarm (5);

 

 
int main()
 
signal(SIGALRM,sig_handler); // Signalhandler für SIGALRM registrieren
signal(SIGINT,sig_handler); // Signalhandler für SIGINT registrieren
 
Alarm (2); // Planen Sie den ersten Alarm nach 2 Sekunden
 
for(int i=1;;i++)
 
printf("%d : Innerhalb der Hauptfunktion\n",i);
Pause(); // warten, bis das Signal verarbeitet wird

 
0 zurückgeben;

Im Screenshot der Ausgabe von Beispiel5.c, Wir können sehen, dass der Alarm 5 Sekunden zurückgesetzt wird, wenn der Benutzer Strg + C eingibt. In diesem Programm haben wir nur eine Handler-Funktion für zwei verschiedene Signale verwendet, aber in der Handler-Funktion wurde überprüft, für welches Signal die Handler-Funktion aufgerufen wird.

Fazit:

Wir haben also gesehen, wie die Alarmfunktion für das Auslösen von Signalen eingestellt werden kann, wie man den Alarm zurücksetzt, wie man einen bereits geplanten Alarm abbricht.

So installieren Sie League of Legends auf Ubuntu 14.04
Wenn Sie ein Fan von League of Legends sind, dann ist dies eine Gelegenheit für Sie, League of Legends zu testen. Beachten Sie, dass LOL von PlayOnLin...
Installieren Sie das neueste OpenRA-Strategiespiel auf Ubuntu Linux
OpenRA ist eine Libre/Free Real Time Strategy Game Engine, die die frühen Westwood-Spiele wie den Klassiker Command & Conquer: Red Alert Red nachbilde...
Installieren Sie den neuesten Dolphin Emulator für Gamecube & Wii unter Linux
Mit dem Dolphin Emulator können Sie Ihre ausgewählten Gamecube- und Wii-Spiele auf Linux-Personalcomputern (PC) spielen. Als frei verfügbarer Open-So...