C-Programmierung

POSIX-Signale mit C-Programmierung

POSIX-Signale mit C-Programmierung
Wir können ein Signal als eine Aktivität definieren, die ausgelöst wird, um eine Operation oder einen Thread zu alarmieren, wenn eine bestimmte signifikante Situation eintrifft. Immer wenn eine Prozedur oder ein Thread ein Signal bestätigt, wird die Prozedur oder der Thread anhalten, was immer sie tun, und sofort Maßnahmen ergreifen. Bei der prozessübergreifenden Koordination kann das Signal wirksam sein. In diesem Handbuch lernen Sie Signalhandler in Linux durch die Sprache C.

Standard- oder reguläre Signale:

Die Header-Datei 'signal.h' enthält Signale als Makrokonstante. Der Titel des Signals begann mit „SIG“ und wird durch eine kurze Signalübersicht vorangestellt. Folglich hat jedes Signal einen eindeutigen numerischen Wert. Der Programmcode sollte den Namen des Signals verwenden, nicht mehrere Signale. Die Ursache dahinter ist, dass die Anzahl der Signale je nach System variieren kann, die Interpretation der Namen aber Standard ist. Unten sind einige reguläre Signale mit ihrer definierten Funktionalität.

SEUFZEND:

Dieses Signal beendet die Verarbeitung. Das Signal SIGHUP wird abgesetzt, um eine Trennung des Benutzerterminals anzuzeigen, wahrscheinlich aufgrund einer unterbrochenen Fernkommunikation oder eines Auflegens.

UNTERZEICHNUNG:

Es wird den Prozess stören. Das SIGINT-Signal wird immer dann empfangen, wenn der Benutzer die INTR-Taste eingibt (normalerweise Strg + C).

SIGQUIT:

Es wird die Verarbeitung stoppen oder beenden. Das SIGQUIT-Signal wird immer dann empfangen, wenn der Benutzer die QUIT-Taste eingibt (normalerweise Strg + \).

Siegel:

Es wird ausgeführt, wenn ein unerlaubter Befehl gemacht wurde. Das Signal SIGILL wird immer dann erzeugt, wenn versucht wird, einen Junk- oder privilegierten Befehl auszuführen perform. Immer wenn der Stack überläuft und die Maschine Probleme mit einer Signalsteuerung hat, kann auch SIGILL erstellt werden.

SIGTRAP:

Es wird aufgerufen, wenn ein Trace-Trap-Befehl ausgeführt wird. Das SIGTRAP-Signal wird durch einen Breakpoint-Befehl und einen weiteren Trap-Befehl erzeugt. Der Debugger verwendet ein solches Signal.

SIGABRT:

Es wird das Abbruchsignal genannt. Das Signal SIGABRT wird durch Aufruf der Methode abort() erzeugt. Ein solches Signal wird verwendet, um auf die Ungenauigkeit hinzuweisen, die vom oben genannten Code beobachtet und vom Methodenaufruf abort() aufgezeichnet wurde.

SIGFPE:

Ausnahme für Gleitkommazahlen; Das SIGFPE-Signal wird erzeugt, wenn ein katastrophaler mathematischer Fehler auftritt.

SIGUSR1 und SIGUSR2:

Die Signale SIGUSR1 und SIGUSR2 können nach Belieben verwendet werden. Für eine einfache Interprozessinteraktion ist es von Vorteil, einen Signalhandler für solche Signale in der Anwendung zu erstellen, die das Signal empfängt.

Standardverhalten von Signalen:

Für jedes Signal gibt es ein Standardverhalten oder eine Standardaktion, und es ist möglich, das Standardverhalten mit der Handler-Funktion anzupassen. Das automatische Signalverhalten von SIGKILL und SIGABRT konnte nicht verändert oder vernachlässigt werden.

Begriff: Es wird die Operation beenden.

Ader: Ein Core-Dump-Dokument wird erstellt und der Vorgang wird abgebrochen.

Zündung: Der Prozess würde ein Signal übersehen.

Halt: Es wird den Betrieb stoppen.

Fortsetzung: Der Betrieb wird bis zur Einstellung aufrechterhalten.

Signalverarbeitung:

Der Prozess hat ein bevorzugtes Verhalten für ein Signal, wenn es quittiert wird. Der Vorgang kann sich wie folgt verhalten:

Das Signal wird automatisch verworfen, wenn das definierte Signalverhalten übersehen wird.

Mit Methoden wie Signal oder Sigaction kann der Code eine Handler-Funktion registrieren. Man nennt es das Abfangen eines Signals von einem Handler.

Wenn ein Signal nicht behandelt oder vernachlässigt wird, kann die Standardaktion auftreten.

Sie können die Signalbehandlungsfunktion wie folgt definieren:

$ Int signal () int signum, void (*funk)(int))

Wenn die Verarbeitung ein Signalsignum erhält, kann die Methode signal() die Methode 'func' aufrufen. Signal() setzt einen Zeiger auf die Methode 'func' zurück, wenn sie erfolgreich ist oder eine Ausnahme auf errno und stattdessen auf -1 zurückgegeben wird.

Der Zeiger 'func' kann drei Werte annehmen:

SIG_DFL: Dies ist ein Zeiger auf die Standardmethode SIG DFL(), die im Header definiert ist.h-Dokument, das zum Abrufen des Standardverhaltens des Signals verwendet wird.

SIG_IGN: Dies ist ein Verweis auf die SIG IGN()-Ignore-Methode, die im Header angegeben ist.h Dokument.

Benutzerdefinierter Handler-Methodenzeiger: Der benutzerdefinierte Handler-Methodentyp void(*)(int) impliziert, dass die Rückgabekategorie void und das einzelne Argument int . ist.

Erstellen Sie eine neue Datei 'signal.c' und schreibe darunter den Signalhandlercode hinein.

Verknüpfe das Signal.c-Datei mit gcc.

Während das Signal läuft.c-Datei haben wir eine Endlosschleife in der main-Methode. Beim Drücken von STRG+C wurde die Handler-Methode gestartet und die Ausführung der Hauptmethode gestoppt. Die Verarbeitung der Hauptmethode wurde nach der Ausführung der Handlermethode fortgesetzt continued. Beim Drücken von Strg+\ wird der Vorgang beendet.

Signal ignorieren:

Um das Signal zu übersehen, erstellen Sie eine Datei 'signal.c' und schreibe darunter Code hinein.

Binde das Ignorieren.c-Datei mit gcc.

Führen Sie das Signal aus.c-Datei. Tippen Sie auf STRG+C, das SIGNIT-Signal wird erstellt; Trotzdem wird das Verhalten nicht bemerkt, da die Handler-Methode als SIG_IGN()-Methode aufgezählt wird.

Signalhandler neu registrieren:

Um den Signalhandler erneut zu registrieren, erstellen Sie eine neue Datei 'rereg.c' und schreibe den folgenden Code hinein:

Verknüpfen Sie die Rereg.c-Datei mit gcc.

Führen Sie die Rereg.c-Datei. Beim ersten Drücken von STRG+C wurde die Handler-Methode ausgelöst und der Signal-Handler erneut in SIG_DFL registriert. Beim erneuten Drücken von STRG+C wurde die Ausführung abgebrochen.

Signale mit Raise() senden:

Erstellen Sie eine Datei "senden".c' und fügen Sie den folgenden Code hinzu. Um Signale an die aufrufende Methode zu senden, wird die Methode raise() verwendet.

Verknüpfen Sie die Sendung.c-Datei mit gcc.

Der Prozess verwendet die Methode raise(), um das SIGUSR1-Signal selbst zu übertragen.

Senden Sie Signale mit Kill():

Fügen Sie den folgenden Code in 'raise . hinzu.c'. Verwenden Sie die Methode kill(), um Signale an die Prozessgruppe zu senden.

Verlinke die Gehaltserhöhung.c-Datei mit gcc.

Durch die Verwendung der kill()-Methode leitet der Prozess das SIGUSR1-Signal an die oben genannten.

Eltern-Kind-Interaktion:

Um die Eltern-Kind-Interaktion zu sehen, schreiben Sie den folgenden Code in eine Datei.

Verbinden Sie die Komm.c-Datei mit gcc.

Fork()/ Methode generiert Kind, kehre null zum Kindprozess zurück und Kind-ID zu Eltern.

Fazit:

In diesem Handbuch haben wir gesehen, wie man das Signal für die Interaktion zwischen Prozessen in Linux erstellt, verarbeitet, sendet, ignoriert, neu registriert und verwendet.

Linker Mausklick funktioniert nicht unter Windows 10
Wenn Sie eine dedizierte Maus mit Ihrem Laptop oder Desktop-Computer verwenden, aber die linker Mausklick funktioniert nicht unter Windows 10/8/7 aus ...
Cursor springt oder bewegt sich zufällig während der Eingabe in Windows 10
Wenn Sie feststellen, dass Ihr Mauszeiger während der Eingabe auf einem Windows-Laptop oder -Computer automatisch und zufällig springt oder sich von s...
So kehren Sie die Scrollrichtung von Maus und Touchpads in Windows 10 um
Maus und Touchpads machen das Rechnen nicht nur einfach, sondern auch effizienter und weniger zeitaufwendig. Wir können uns ein Leben ohne diese Gerät...