C ++
 Computer >> コンピューター >  >> プログラミング >> C ++

C++での信号処理


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

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

信号
説明
SIGABRT
中止の呼び出しなど、プログラムの異常終了。 。
SIGFPE
ゼロ除算やオーバーフローを引き起こす演算など、誤った算術演算。
SIGILL
不正な命令の検出。
SIGINT
インタラクティブな注意信号の受信。
SIGSEGV
ストレージへの無効なアクセス。
SIGTERM
プログラムに送信された終了要求。

signal()関数

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

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

簡単に言うと、この関数は2つの引数を受け取ります。1つ目は信号番号を表す整数として、2つ目は信号処理関数へのポインターとしての引数です。

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

#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.

  1. C++での例外処理の基本

    C ++では、例外処理はランタイムエラーを処理するプロセスです。例外は、C++で実行時にスローされるイベントです。すべての例外は、std::exceptionクラスから派生します。処理可能なランタイムエラーです。例外を処理しない場合は、例外メッセージを出力してプログラムを終了します。 例外は、C ++標準では、プログラム内で使用できるクラスとして定義されています。親子クラス階層の配置を以下に示します。 C++の一般的な例外クラスは次のとおりです。 例外 説明 std ::exception これは、すべての標準C++例外の例外および親クラスです。 std ::

  2. C ++でのファイル処理におけるtellp()

    C ++ファイル処理では、tellp()関数が出力ストリームで使用され、ストリーム内のポインターの現在のプット位置を返します。ストリームポインタの現在の位置を表す整数データ型を返します。 tellp() method takes no parameter. It is written as: pos_type tellp(); アルゴリズム Begin.    Create an object newfile against the class fstream.    Call open() method to open a file “tp