Cplusplus-cpp-signal-handling

提供:Dev Guides
移動先:案内検索

C ++シグナル処理

シグナルとは、プログラムを途中で終了させる可能性のあるオペレーティングシステムによってプロセスに配信される割り込みです。 UNIX、LINUX、Mac OS X、またはWindowsシステムでCtrl + Cを押すと、割り込みを生成できます。

プログラムでキャッチできないシグナルがありますが、プログラムでキャッチできるシグナルの以下のリストがあり、シグナルに基づいて適切なアクションを実行できます。 これらの信号は、C ++ヘッダーファイル<csignal>で定義されています。

Sr.No Signal & Description
1

SIGABRT

  • abort* の呼び出しなど、プログラムの異常終了。
2

SIGFPE

ゼロ除算やオーバーフローを引き起こす演算などの誤った算術演算。

3

SIGILL

違法な命令の検出。

4

SIGINT

インタラクティブな注意信号の受信。

5

SIGSEGV

ストレージへの無効なアクセス。

6

SIGTERM

プログラムに送信された終了要求。

signal()関数

C ++シグナル処理ライブラリは、予期しないイベントをトラップする関数 signal を提供します。 以下は、signal()関数の構文です-

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

シンプルに保つと、この関数は2つの引数を受け取ります。最初の引数はシグナル番号を表す整数で、2番目の引数はシグナル処理関数へのポインターです。

signal()関数を使用してSIGINTシグナルをキャッチする簡単なC ++プログラムを作成しましょう。 プログラムでキャッチするシグナルが何であれ、 signal 関数を使用してそのシグナルを登録し、シグナルハンドラーに関連付ける必要があります。 次の例を調べます-

#include <iostream>
#include <csignal>

using namespace std;

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

  //cleanup and close up stuff here
  //terminate program

   exit(signum);
}

int main () {
  //register signal SIGINT and signal handler
   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()関数

関数* raise()*でシグナルを生成できます。これは、引数として整数シグナル番号を取り、次の構文を持ちます。

int raise (signal sig);

ここで、 sig は、SIGINT、SIGABRT、SIGFPE、SIGILL、SIGSEGV、SIGTERM、SIGHUPのいずれかのシグナルを送信するシグナル番号です。 以下は、次のようにraise()関数を使用して内部的に信号を上げる例です-

#include <iostream>
#include <csignal>

using namespace std;

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

  //cleanup and close up stuff here
  //terminate program

   exit(signum);
}

int main () {
   int i = 0;
  //register signal SIGINT and signal handler
   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.