POSIX -Signale in C

POSIX -Signale in C

„Was tun Sie beim Fahren am Straßenrand, wenn Sie eine Begegnung mit einem roten Signal haben?? Sie hören eine Weile auf zu fahren, um auf Ihren Zug zu warten, bis das Signal grün wird. In ähnlicher Weise fahren Sie weiter, wenn ein Signal eine orangefarbene Farbe hat, weiter fahren und nie anhalten. POSIX -Signale funktionieren genauso wie das Verkehrssignal funktioniert. Die POSIX -Signalbibliothek hat eine sehr einfache Funktion entwickelt, die im C -Code verwendet werden sollte, um Signale zu generieren, Ihre Programme auf ihre Ausführung zu warten, und vieles mehr. Dieser Artikel würde alle diese Signalfunktionen demonstrieren. Wir haben unsere Beispiele mit der Erstellung und Öffnung einer C -Datei begonnen.”

Beispiel 01

Innerhalb des ersten POSIX -Beispiels von Signalen werden wir die Verwendung einer einfachen Signal () -Funktion zum Erstellen und Aufrufen eines Signals demonstrieren. Daher haben wir das Signal verwendet.H Bibliothek von C, um die Signalfunktionen zu verwenden, das stdio.H Bibliothek wird für Standardausgabe- und Eingangsfunktionen und die Unistd verwendet.H Bibliothek wird verwendet, um benutzerdefinierte Strukturen zu verwenden, i, i.e., Funktionen. Der Code enthält eine einfache Handlerfunktion mit dem Namen "Handle" mit ganzzahliger Argument "S"."Diese Variable" S "arbeitet als Signal. Es enthält eine einfache Printf -Anweisung, um dem Benutzer ein Signal „Stopp“ zu senden.

Die Funktion main () beginnt mit dem Erstellen eines Signals, das hier die Funktion „Signal“ verwendet, während die Option „SIGINT“ verwendet wird, um ein Signal und die Funktion „Handle“ zu initialisieren, um diese Funktion als Signalhandler zu verwenden. Die "für" -Sloop startet von "1", aber es hat kein Ende, ich.e., Es wird inkrementiert, stoppt aber nie, bis Sie es selbst tun, indem Sie das Programm verlassen. Die Schleife enthält eine Printf -Anweisung von C, um anzuzeigen, dass wir uns derzeit in der Funktion main () befinden. Durch die Verwendung der Strg+C -Verknüpfung können wir die Funktion "Handle () aufrufen, um eine Signalnachricht anzuzeigen.

Bei jeder Iteration der „für“ Schleife schläft sie 5 Sekunden lang und wird dann inkrementiert. Lassen Sie uns unseren Signal -C -Code ausführen, nachdem wir die Fehler ordnungsgemäß gespeichert und beseitigt haben.

#enthalten
#enthalten
#enthalten
Hohlraumhandel (int s)
printf ("\ nstop ... \ n");

int main ()
Signal (SIGint, Handle);
für (int i = 1 ;; i ++)
printf ("%d: main ... \ n", i);
Schlaf (5);
Rückkehr 0;

Wenn Sie dieses Programm mit dem Compiler von „C“ ausführen und es mit dem “ausführen.A/.Out “Abfrage, Sie werden eine unendliche Ausführung des Main () -Threads sehen.

Als wir auf "Strg+C" gedrückt wurden, um die Signalhandlerfunktion aufzurufen, wird die Funktion "Handle ()) ausgeführt und zeigte derzeit" Stopp "angezeigt. Danach geht die Steuerung erneut an die Main () -Methode und beginnt erneut, seine PRINTF -Anweisung mit der unendlichen „für“ Schleife auszuführen. Wir haben die Taste "Strg+z" gedrückt, um dieses Programm zwangs zu stoppen.

Angenommen, Sie möchten das von einem Benutzer aufgerufene Signal ignorieren möchten. Dies kann unter Verwendung des Parameters sig_ign der Signal () -Funktion durchgeführt werden, ohne dass eine Handlerfunktion verwendet wird. Wir verwenden den gleichen Code mit einer leichten Änderung der Signal () -Funktion. Wenn ein Benutzer unter Verwendung dieser Funktion ein Signal mit der Verknüpfung „Strg+C“ aufruft, ignoriert das Programm das Signal und führt weiterhin den Funktionsthread von Main () aus. Lassen Sie uns dieses Programm schnell speichern und ausführen, um die Ausgabe zu sehen.

#enthalten
#enthalten
#enthalten
int main ()
Signal (SIGINT, SIG_IGN);
für (int i = 1 ;; i ++)
printf ("%d: das Signal ignorieren ... \ n", i);
Schlaf (5);
Rückkehr 0;

Nach dieser Codeausführung wird die main () -Funktion printf () -Anweisung auch nach der Verwendung der Verknüpfung „Strg+C“ weiter ausgeführt. Also haben wir das Programm am Ende gewaltsam gestoppt.

Beispiel 02

Wenn Sie ein Signal für Ihr C -Programm automatisch anheben möchten, ohne den Taste zur Strg+C. Daher haben wir den Code aus dem ersten Beispiel aktualisiert und eine Handle () -Funktion erneut hinzugefügt. Die Funktion main () beginnt mit der Erstellung eines Signals unter Verwendung der Signal () -Funktion, indem sie eine Option „sigusr1“ mit der Funktion „Handle“ in den Parametern übergeben hat. Diese Sigussr1 -Option ist der Schlüssel zur Erzeugung eines automatischen Signals. Die „für“ -Schloop schläft 10 Sekunden nach der Ausführung der PRINTF -Anweisung und ruft dann die Funktion raisie () mit der Option SIGUSR1 auf, um ein automatisches Signal zu generieren, indem die Funktion „Handle“ aufgerufen wird. Das ist es; Wir sind bereit, dieses Programm vorerst auszuführen.

#enthalten
#enthalten
#enthalten
Hohlraumhandel (int s)
printf ("\ nraise ... \ n");
Schlaf (5);

int main ()
Signal (Sigusr1, Handle);
für (int i = 1 ;; i ++)
printf ("%d: main ... \ n", i);
Schlaf (10);
Erhöhung (sigusr1);
Rückkehr 0;

Nach der erfolgreichen Zusammenstellung findet die Ausführung statt. Der Main () Thread GPT wird ausgeführt und das Programm schläft 10 Sekunden, während es in der Schleife ist.

Nach 10 Sekunden wurde die Erhöhungsfunktion angerufen, um ein automatisches Signal zu generieren, indem die Handelsfunktion aufgerufen wird. Die Ausführung schläft für die nächsten 5 Sekunden in der Handelsfunktion.

Die Steuerung wird an die Haupt- () -Funktion „Schleife“ zurückgegeben, und dieser Vorgang wird fortgesetzt, bis Sie das Programm bereitwillig mit der Strg+Z -Verknüpfung beenden.

Genau wie Ihr automatisches Signal für Ihr Programm können Sie auch das Signal nach dem Aufrufen des Signals abtöten und das Signal an eine Verarbeitungsgruppe senden. Mit anderen Worten, die "Kill" -Funktion der POSIX C -Signale -Bibliothek wurde verwendet, um Warnungen an die Gruppe des Programms zu senden. Daher haben wir unser Hauptprogramm zusammen mit seiner Handlungsfunktion im obigen Abgeordneten Bildcode aktualisiert. Das PID_T -Objekt wird verwendet, um eine ID „P“ für den Prozess zu erstellen. Die Signal () -Funktion wird hier aufgerufen, um ein Signal durch die Verwendung der vor der Hauptfunktion definierten Handle () -Funktion zu erstellen.

Die Funktion getPid () wird in der Schleife "für" aufgerufen, um die Prozess -ID dieses Threads zu erhalten und sie in einer Variablen "P" zu speichern. Diese Prozess -ID "P" wird zusammen mit der Option Sigusr1 an die "Kill" -Funktion übergeben, um das Signal zu töten und seinen Bericht an eine Fortschrittsgruppe zu senden. Dann schläft ein Programm 8 Sekunden lang und druckt „zurück in Main“, während die Schleife fortgesetzt wird.

#enthalten
#enthalten
#enthalten
Hohlraumhandel (int s)
printf ("\ nstop ... \ n");

int main ()
pid_t p;
Signal (Sigusr1, Handle);
für (int i = 1 ;; i ++)
printf ("%d: main ... \ n", i);
p = getPid ();
Kill (P, Sigusr1);
Schlaf (8);
printf ("zurück in main \ n");
Rückkehr 0;

Die Funktion wird ausgeführt, sendet das Signal an die Prozessgruppe und schläft 8 Sekunden lang.

Das „Zurück in Main“ wurde ausgeführt, und die Schleife setzte die gleiche Verarbeitung fort.

Abschluss

Dieser Leitfaden hat die Verwendung von Signalfunktionen im C -Programm demonstriert, um Ihre Arbeitsumgebung effizienter zu gestalten. Zu diesem Zweck haben wir die Funktion Signal () -Funktion, Kill () und Raise () zusammen mit den Optionen SIGINT, SIGINT, SIGN und SIGUSR1 in den Funktionen ausprobiert.