Vorwort Langsame Systemaufrufe beziehen sich auf Systemaufrufe, die möglicherweise nie zurückkehren und den Prozess somit für immer blockieren. Beispielsweise sind „Accept“ (Akzeptieren), wenn keine Client-Verbindung besteht, und „Read“ (Lesen), wenn keine Eingabe erfolgt, beides langsame Systemaufrufe. Wenn unter Linux ein Prozess, der in einem langsamen Systemaufruf blockiert ist, ein Signal erfasst, wird der Systemaufruf unterbrochen und stattdessen die Signalverarbeitungsfunktion ausgeführt. Dies ist der unterbrochene Systemaufruf. Wenn die Signalverarbeitungsfunktion jedoch zurückkehrt, können die folgenden Situationen auftreten:
Als Nächstes schreiben wir Code, um die oben genannten Situationen jeweils zu überprüfen, in denen der Systemaufruf „Lesen“ auswählt, das Unterbrechungssignal „SIGALRM“ auswählt und das Unterbrechungssignal durch einen Alarm generiert wird. Signal verwenden #include <stdio.h> #include <signal.h> #include <unistd.h> #include <errno.h> void-Handler (int s) { printf("Lesen wird durch Signalhandler unterbrochen\n"); zurückkehren; } int main() { char Puffer[10]; int nread = 0; Signal (SIGALRM, Handler); Alarm(2); printf("Lesestart\n"); nread = lesen(STDIN_FILENO, buf, sizeof(buf)); printf("lesen return\n"); wenn ((nread < 0) und (errno == EINTR)) { printf("Leserückgabe fehlgeschlagen, Fehlernummer ist EINTR\n"); } gebe 0 zurück; } Verwenden Sie Sigaction + Standard #include <stdio.h> #include <signal.h> #include <unistd.h> #include <errno.h> void-Handler (int s) { printf("Lesen wird durch Signalhandler unterbrochen\n"); zurückkehren; } int main() { char Puffer[10]; int nread = 0; Struktur, Signatur, Akt; sigempyset(&act.sa_mask); act.sa_handler = Handler; act.sa_flags = 0; //Setzen Sie das SA_RESTART-Flag für das SIGALRM-Signal nicht und verwenden Sie die Standardverarbeitungsmethode von Sigaction //act.sa_flag |= SA_INTERRUPT; //SA_INTERRUPT ist die Standardverarbeitungsmethode von Sigaction, d. h. der unterbrochene Systemaufruf wird nicht automatisch neu gestartet. //Tatsächlich wird Sigaction gemäß SA_INTERRUPT verarbeitet, solange SA_RESTART nicht gesetzt ist, unabhängig vom Wert von act.sa_flags sigaction(SIGALRM, &act, NULL); Alarm(2); printf("Lesestart\n"); nread = lesen(STDIN_FILENO, buf, sizeof(buf)); printf("lesen return\n"); wenn ((nread < 0) und (errno == EINTR)) { printf("Leserückgabe fehlgeschlagen, Fehlernummer ist EINTR\n"); } gebe 0 zurück; } Verwenden Sie Sigaction + geben Sie das Flag SA_RESTART an #include <stdio.h> #include <signal.h> #include <unistd.h> #include <errno.h> void-Handler (int s) { printf("Lesen wird durch Signalhandler unterbrochen\n"); zurückkehren; } int main() { char Puffer[10]; int nread = 0; Struktur, Signatur, Akt; sigempyset(&act.sa_mask); act.sa_handler = Handler; act.sa_flags = 0; act.sa_flags |= SA_RESTART; //Setze das SA_RESTART-Flag für das SIGALRM-Signal sigaction(SIGALRM, &act, NULL); Alarm(2); printf("Lesestart\n"); nread = lesen(STDIN_FILENO, buf, sizeof(buf)); printf("lesen return\n"); wenn ((nread < 0) und (errno == EINTR)) { printf("Leserückgabe fehlgeschlagen, Fehlernummer ist EINTR\n"); } gebe 0 zurück; } Aufgrund der Unterschiede in der Behandlung unterbrochener Systemaufrufe ergeben sich für Anwendungen im Zusammenhang mit unterbrochenen Systemaufrufen folgende Probleme:
int nread = lesen(fd, buf, 1024); wenn (Anzahl der gelesenen Zahlen < 0) { wenn (errno == EINTR) { //Der Lesevorgang wird unterbrochen, was nicht als Fehler angesehen werden sollte. Sie können entsprechend Ihren tatsächlichen Anforderungen damit umgehen, z. B. indem Sie den Leseaufruf neu schreiben oder ihn ignorieren.} anders { //den tatsächlichen Lesefehler lesen} } Zusammenfassen Das Obige ist der vollständige Inhalt dieses Artikels. Ich hoffe, dass der Inhalt dieses Artikels einen gewissen Lernwert für Ihr Studium oder Ihre Arbeit hat. Vielen Dank für Ihre Unterstützung von 123WORDPRESS.COM. Das könnte Sie auch interessieren:
|
<<: MySQL-Konfiguration SSL-Master-Slave-Replikation
>>: React antd realisiert dynamische Vergrößerung und Verkleinerung der Form
Die WEB-Entwicklung besteht hauptsächlich aus zwe...
Das neue Projekt ist im Grunde abgeschlossen. Es ...
Dieser Artikel stellt ein Tutorial zur Verwendung...
Vorwort Um in Webanwendungen Datenverkehr zu spar...
Inhaltsverzeichnis 1. Was ist ein Abschluss? 2. D...
In diesem Artikel wird ein Jalousie-Spezialeffekt...
Heute werde ich Sie durch die Geschichte von ext4...
Entsprechend den wichtigsten Websites und persönl...
Der Standardtabellenname ist „base_data“ und der ...
Inhaltsverzeichnis Einführung in utf8mb4 Fehler b...
Voraussetzung: Celery wird in Django eingeführt. ...
Vorwort Kürzlich habe ich zufällig MySQLs Coalesc...
Inhaltsverzeichnis Vorwort Erkennen des geöffnete...
Wenn Sie keine Javascript-Steuerung verwenden möch...
1 Einleitung Nachdem „Maven Springboot mit einem ...