Cplusplus-cpp-signal-handling
C ++シグナル処理
シグナルとは、プログラムを途中で終了させる可能性のあるオペレーティングシステムによってプロセスに配信される割り込みです。 UNIX、LINUX、Mac OS X、またはWindowsシステムでCtrl + Cを押すと、割り込みを生成できます。
プログラムでキャッチできないシグナルがありますが、プログラムでキャッチできるシグナルの以下のリストがあり、シグナルに基づいて適切なアクションを実行できます。 これらの信号は、C ++ヘッダーファイル<csignal>で定義されています。
Sr.No | Signal & Description |
---|---|
1 |
SIGABRT
|
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.