Latest web development tutorials

C ++の信号処理

信号は、オペレーティングシステムによって渡され、プロセスは、プログラムの意志早期終了、中断されます。 UNIX、LINUX、Mac OS XまたはWindowsシステムでは、Ctrlキー+ C割り込みを押すことができます。

いくつかの信号は、手順を捕まえたが、プログラムに取り込むことができ、信号以下の表に記載されている、および信号に基づいて適切な行動を取ることができますすることができません。 これらの信号は、C ++ヘッダー・ファイル<csignal>内で定義されています。

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

信号()関数

C ++ライブラリは、緊急事態を捕捉するために、信号の信号処理機能を提供します。 次の構文信号()関数です。

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

この関数は、2つのパラメータを受け取ります。最初のパラメータは、信号の数を表す整数で、2番目のパラメータは、信号処理関数へのポインタです。

のは、SIGINT信号を捕捉するための信号()関数を使用する単純なC ++プログラムを書いてみましょう。 どんなにあなたがあなたのプログラムの中で信号をキャプチャしたいのか、あなたは信号、およびプログラムに関連する信号処理を登録するシグナル関数を使用する必要があります。 次の例を考えてみます。

#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;
}

上記のコードはコンパイルされ、実行されると、次の結果を生成します。

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

今は、Ctrl + Cは、プログラムを中断するには、プログラム信号の取り込みを参照し、次の操作を印刷するプログラムを終了します。

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

()関数を上げます

あなたが信号を生成)(関数raiseを使用することができ、信号の機能は、次の構文、パラメータとして整数を取ります。

int raise (signal sig);

ここで、sigは信号伝送すべき数字である。これらの信号が含まれます:SIGINT、SIGABRT、SIGFPE、SIGILL 、SIGSEGV、SIGTERM、SIGHUPを。ここでは、昇給()関数は、インスタンス内の信号を生成し、使用しているものです:

#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;
}

上記のコードはコンパイルされ、実行されると、次の結果を生成し、自動的に終了します。

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