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言語