In einem gesonderten Leitfaden werden wir einige der möglichen Ursachen hervorheben, die zur Win32-Signalverarbeitung führen können, und einige Möglichkeiten zur Behebung dieses Problems aufzeigen.Computercode ist jeder Software-Interrupt, der Sie nur durch den Prozess führt. Das Betriebssystem ermöglicht es Ihnen, Signale zum Melden von Ausschlüssen zu senden, um Sie bei dem Betriebsprogramm zu unterstützen. Wenn jemand auf ein Ereignis wartet, das Impulse auslöst, können Sie einen Trainerparameter festlegen und das Betriebssystem benachrichtigen, sobald dieses bestimmte Tag zur Laufzeit auftritt.

Syntax

  nutzlos __cdecl * signal (int Signatur, int (* func) (int, int)); 

Parameter

Spaß
Der anschließende Parameter kann ein Zeiger sein, der die Ausführung der Funktion unterstützt. Der erste Parameter ist eigentlich der Signalpreis, und der Client-Parameter ist ein weiterer Subcode, der, wenn er gelegentlich verwendet wird, der erste SIGFPE -Parameter ist.

Rückgabewert

Broadcast gibt die Funktion zur Fortsetzung der Ausführung zurück, die mit dem angegebenen Signal verknüpft ist. Wenn beispielsweise der vorherige func SIG_IGN Wert verwendet wird, würde der Rückgabewert SIG_IGN lauten. Die Rückgabebelohnung für SIG_ERR weist auf einen Fehler hin. dieses Argument ist errno auf EINVAL gesetzt.

SIGINT und Warnungen können mit Windows-Kill unter Verwendung der Windows-Kill -SIGINT-PID-Syntax an Software gesendet werden, die in die PID von Microsofts pslist gestapelt werden kann.

Siehe errno , _doserrno , _sys_errlist und zusätzlich _sys_nerr zum Erhöhen von Rückkehrcodes. Information.

win32-Signalverarbeitung

Die Signal -Funktionen ermöglichen einem Prozess, zwischen mehreren Möglichkeiten zu wählen, um das entsprechende Interrupt-Signal von einem im Allgemeinen Arbeitergerät aufrechtzuerhalten. Das Argument Signatur ist der Interrupt, auf den unser eigenes -Signal reagiert; Diese Aufgabe muss eine der Express-Konstanten der Fangemeinde sein, die mitfeel SIGNAL.H verfolgt werden können.

Sig Betrag Beschreibung

SIGABRT Abnormales Ende SIGFPE Gleitkommafehler SIGILL Ungesetzliches erfahren ZEICHEN Signal STRG + C SIGSEGV Illegaler Speicherzugriff SIGTERM Stornierungsanfrage

Wenn sig ein Spezifikum ist, das nicht zu unseren obigen Werten gehört, dann wird der ill-Parameter-Handler zweifellos aufgerufen, nur weil er in seiner Parametervalidierung . Wenn die Ausführung möglicherweise fortgesetzt wird, setzt unsere Funktion errno auf EINVAL und gibt sogar SIG_ERR zurück.

Nachricht beendet den PDF-Aufruf mit Exitcode 3, unabhängig vom zugehörigen Wert der Signatur .

Leerzeichen func ist zweifellos die Adresse des Single Point Managers, den Sie schreiben, oder Sie des vordefinierten SIG_DFL oder SIG_IGN , der werden auch in SIGNAL verfügbar. H. Wenn func eine letzte Funktion ist, wird sie trotz eines speziellen Handler-Passcodes für den angegebenen Computercode gesetzt. Beachten Sie, dass der Handler-Prototyp ein einziges formales Argument erfordert, signature , vom Stempel zu int . Das Betriebssystem stellt ein geeignetes Basisargument mit -Signatur bereit, wenn ein exklusiver Interrupt auftritt; ein Argument ist der Index, der den Interrupt zusammengestellt hat. Daher werden Sie manchmal höchstwahrscheinlich alle sechs Manifeste verwenden, um jederzeit dieselben Operationen (in der vorherigen Tabelle aufgeführt) in Ihrem Regelhandler zu definieren und die entsprechenden Stopps auszuführen. Zum Beispiel können Sie signal einfach zweimal anrufen, um für denselben Benutzer zwei gegensätzliche Signale auszulagern, und das Argument Signatur in Ihrem Handler testen, um wirklich unterschiedliche Dinge zu tun meistens auf allen empfangenen. Signal. … …

Wenn Sie mit dem Testen auf Hängepunkt-Ausnahmen ( SIGFPE ) fertig sind, zielt func auf eine Funktion ab, sodass eine optionale zweite Fehde stattfindet, die auch eine dieser vielen manifesten Konstanten ist . über kategorische FLOAT.H Online-Formulare FPE_xxx . Wenn die Welt sigfpe erscheint, können Sie jeden Wert dieser zweiten speziellen Kontroverse überprüfen, um die Klasse dieser Gleitkommaausnahme zu bestimmen und dann entsprechende Maßnahmen ergreifen. Dieses Argument und mögliche Werte sind Microsoft-Erweiterungen.

Für Ausnahmen wurde der wahre Gleitkommawert func nicht gelöscht, wenn ein Signal empfangen werden konnte. Um Ausnahmen in Gleitkomma-Shops abzufangen, werden try/except-Klauseln verwendet, die normalerweise Gleitkomma-Aktivitäten umgeben. Sie können sogar setjmp verwenden, um unser longjmp this wiederherzustellen. In jedem Fall wird die Nummerierungsarbeit neu gestartet und der Status zusammen mit der Gleitkomma-Aktion wird nicht mehr gesetzt.

Wenn das Signal drejer sig zurückkehrt, nimmt der Unternehmensaufruf die Funktionalität sofort nach der angegebenen Zeit wieder auf, zu der er auch das Unterbrechungssignal empfangen hat. Dies kann unabhängig vom laufenden Sendetyp angewendet werden.

func wird wahrscheinlich gesetzt, um Ihnen SIG zu helfen, bevor dies erfolgreich ausgeführt wird_DFL . Die nächste störende Verbindung wird wie von SIG_DFL angegeben behandelt, es sei denn, die Zwischenkonversation, wenn Sie eine -Routine benötigen, gibt etwas anderes an. Mit dieser Funktion können Sie die Anzeigen aller aufgerufenen Funktionen löschen.

Da Signal-Handler-Routinen normalerweise weiterhin asynchron aufgerufen werden, wenn ein Stopp auftritt, kann ihre Signal-Handler-Funktion durchaus getestet werden, wenn die Laufzeit als unvollständig angesehen wird und unter unbekannten Umständen. Die folgende Liste listet die Einschränkungen in Bezug auf Gründe auf, die Funktionen definieren, die wir optional in Ihrer Computercode-Handler-Routine verwenden können.

  • Keine Zwangslage mit zu niedrigem Pegel zusätzlich STDIO.I / O h Programme (zB printf noch Frösche ).

  • Rufen Sie keine Heap-Routinen oder Tools auf, die Heap-Routinen verwenden (zur Veranschaulichung malloc , _strdup oder vielleicht ein _putenv ). Weitere Informationen finden Sie unter malloc .

  • Helfen Sie nicht mit irgendwelchen Funktionen, die einen Gadget-Aufruf auf dem Computer generieren (z.B. mer, _getcwd , evtl. season ).

  • Beginnen Sie nicht mit der Verwendung von longjmp , es sei denn, die Geräusche werden durch die Ausnahme des Flugpunkts verursacht (d. h. Signatur SIGFPE ) . Wenn wir zuerst alle Gleitkomma-Boxen mit einem erfolgreichen Aufruf von _fpreset ausgeben. Nein

  • Verwenden Sie wahrscheinlich keine Overlay-Routinen.

Die Webvorlage muss Gleitkommacode enthalten, der aufgeführt ist, dass bei Verwendung unserer Funktion eine SIGFPE Cardio-Ausnahme ausgelöst wird. Wenn Ihr Programm definitiv keinen Gleitkommacode bereitstellt und Code aus der Laufzeitbibliothek wünscht, deklarieren Sie leicht einen riskanten Double-Wert und initialisieren Sie ihn daher auf Null:

  erratisches Doppel d = 0.0f; 

Die SIGILL zusätzlich SIGTERM Signale werden unter Windows nicht gemacht. Sie dienen der ANSI-Konformität. Daher können Sie Handler für diese Signale bereitstellen, indem Sie das Installationsprogramm signal generieren, und Sie generieren diese Signale auch explizit, indem Sie mit raise Mobiltelefonanrufen arbeiten .

win32-Symbolbehandlung

Signalparameter werden beim Erstellen von Prozessen nicht beibehalten, die per Telefonleitungsnachrichten an _exec oder . erstellt wurden _spawn . Die Signalparameter können möglicherweise in einem völlig neuen Prozess auf einen bestimmten Standardbetrag zurückgesetzt werden.

Anforderungen

Regulär Erforderliche Überschrift

Signal

Beispiel

Verwenden Sie sigaction, um einen Handler nur für das SIGABRT-Signal zu registrieren.Verwenden Sie die sig_atomic_t-Änderung in Ihrem Signalhandler.

Das folgende Beispiel zeigt, wie Expos jedes unserer -Signale verwendet, um das bestimmte ausgewählte benutzerdefinierte Verhalten zum . hinzuzufügen SIGABRT Passwort. Weitere Ratschläge zur süchtigen Abtreibung finden Sie unter _set_abort_behavior .

  // crt_signal.c// kompilieren mit: / EHsc versus W4// Verwenden Sie das Signal, um einen Signalhandler zu verknüpfen, um die Hauptroutine normal zu unterbrechen#include #include void SignalHandler (komplettes Signal)    für den Fall, dass (Signal == SIGABRT)       // Abbrechen des Drejer Sig-Code-Signals     Außerdem       // ...    int main ()    leer typedef (* SignalHandlerPointer) (int);    SignalHandlerPointer previousHandler;    previousHandler stimmt mit Wert überein (SIGABRT, SignalHandler);    abbrechen (); 

Das Produkt basiert auf der verwendeten Laufzeit, unabhängig davon, ob es sich um eine konsolenbasierte Windows Live- oder Anwendungsumgebung und eine Windows-Registrierungsumgebung handelt. In der Hauptkonsolenanwendung ist ein Fehler aufgetreten!Programm: stderr:

  Debug c:  Projekte  crt_signal  Debug  crt_signal.exeR6010- einen Anruf abbrechen () 

Siehe auch

  • 5 Minuten zum Lesen.

Verwenden Sie diese Methode tatsächlich, um eine Microsoft Store-App auf Papier zu schließen, außer in Testszenarien, die ansonsten debuggen. Programmatische oder einfache UI-Richtlinien zum Schließen einer Store-App sind möglicherweise nicht zulässig, solange Sie die Microsoft Store -Richtlinien befolgen. Bemerkung . Weitere Informationen finden Sie unter UWP Lifecycle app.Ist

Signatur wird für ein Win32-Produkt nicht unterstützt. Wenn ein einzelner STRG + C-Interrupt auftritt, generieren Win32-Betriebssysteme sorgfältig einen sehr neuen Interrupt, um diesen Interrupt speziell zu behandeln. Dies führt häufig dazu, dass eine UNIX-ähnliche Singlethread-Anwendung multithreaded wird und unerwartetes Verhalten verursacht.