工業製造
産業用モノのインターネット | 工業材料 | 機器のメンテナンスと修理 | 産業プログラミング |
home  MfgRobots >> 工業製造 >  >> Industrial programming >> C言語

C++ シグナル処理

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

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

Sr.No 信号と説明
1

SIGABRT

abort の呼び出しなど、プログラムの異常終了 .

2

SIGFPE

ゼロ除算やオーバーフローが発生する演算など、誤った算術演算。

3

シジル

不正な命令の検出。

4

シギント

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

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);

ほら、シグ 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.

C言語

  1. C++ データ型
  2. C++ 演算子
  3. C++ コメント
  4. C++ クラス テンプレート
  5. Cファイルの取り扱い
  6. C++ 例外処理:Try、Catch、throw の例
  7. C - エラー処理
  8. C++ の概要
  9. C++ 定数/リテラル
  10. C++ の演算子
  11. C++ の数値