Latest web development tutorials

C ++ Signalverarbeitung

Das Signal wird durch das Betriebssystem übergeben, wird der Prozess unterbrochen wird, wird die vorzeitige Beendigung eines Programms. Unter Unix, Linux, Mac OS X oder Windows-Systemen können Sie Strg + C Unterbrechung drücken.

Einige Signale können nicht gefangen Verfahren werden, aber in der folgenden Tabelle aufgeführt dem Signal kann in das Programm aufgenommen werden, und entsprechende Maßnahmen ergreifen kann basierend auf dem Signal. Diese Signale werden in der C ++ Header-Datei definiert <csignal> in.

信号 描述
SIGABRT 程序的异常终止,如调用abort
SIGFPE 错误的算术运算,比如除以零或导致溢出的操作。
SIGILL 检测非法指令。
SIGINT 接收到交互注意信号。
SIGSEGV 非法访问内存。
SIGTERM 发送到程序的终止请求。

Signal () Funktion

C ++ Bibliothek stelltSignal Signalverarbeitungsfunktion Notfälle zu erfassen.Das Folgende ist die Syntax-Signal () Funktion:

void (*signal (int sig, void (*func)(int)))(int); 

Diese Funktion übernimmt zwei Parameter: der erste Parameter eine ganze Zahl, die die Anzahl eines Signals; zweiter Parameter einen Zeiger auf eine Signalverarbeitungsfunktion ist.

Nehmen wir ein einfaches C ++ Programm schreiben, das das Signal () Funktion verwendet SIGINT Signal zu erfassen. Egal , was Sie das Signal in Ihrem Programm aufnehmen möchten, müssen Sie dieSignalfunktion verwenden das Signal und die Signalverarbeitung zu registrieren Zusammenhang mit dem Programm.Betrachten Sie die folgenden Beispiele:

#include <iostream>
#include <csignal>

using namespace std;

void signalHandler( int signum )
{
    cout << "Interrupt signal (" << signum << ") received.\n";

    // 清理并关闭
    // 终止程序  

   exit(signum);  

}

int main ()
{
    // 注册信号 SIGINT 和信号处理程序
    signal(SIGINT, signalHandler);  

    while(1){
       cout << "Going to sleep...." << endl;
       sleep(1);
    }

    return 0;
}

Wenn der obige Code kompiliert und ausgeführt wird, erzeugt es die folgenden Ergebnisse:

Going to sleep....
Going to sleep....
Going to sleep....

Nun drücken Sie Strg + C, um das Programm zu unterbrechen, müssen Sie das Programmsignal zu erfassen, zu sehen und das Programm zu beenden folgendes zu drucken:

Going to sleep....
Going to sleep....
Going to sleep....
Interrupt signal (2) received.

erhöhen () Funktion

Sie können die Funktionraise () verwenden , erzeugt ein Signal, nimmt die Signalfunktion eine ganze Zahl als Parameter, die folgende Syntax:

int raise (signal sig);

Hier sig ist das Signal Diese Signale umfassen übertragen Zahlen werden: SIGINT, SIGABRT, SIGFPE, SIGILL , SIGSEGV, SIGTERM, SIGHUP.Hier ist, was wir benutzen die Erhöhung () Funktion erzeugt ein Signal innerhalb einer Instanz:

#include <iostream>
#include <csignal>

using namespace std;

void signalHandler( int signum )
{
    cout << "Interrupt signal (" << signum << ") received.\n";

    // 清理并关闭
    // 终止程序 

   exit(signum);  

}

int main ()
{
    int i = 0;
    // 注册信号 SIGINT 和信号处理程序
    signal(SIGINT, signalHandler);  

    while(++i){
       cout << "Going to sleep...." << endl;
       if( i == 3 ){
          raise( SIGINT);
       }
       sleep(1);
    }

    return 0;
}

Wenn der obige Code kompiliert und ausgeführt wird, erzeugt es die folgenden Ergebnisse und wird automatisch beendet:

Going to sleep....
Going to sleep....
Going to sleep....
Interrupt signal (2) received.