1.3.07_C++信号処理

2642 ワード

信号はオペレーティングシステムからプロセスに伝達される割り込みであり、プログラムが早期に終了します.
UNIX、LINUX、Mac OS XまたはWindowsシステムでは、Ctrl+Cを押すことで割り込みが発生します.
一部の信号はプログラムによってキャプチャできないが、下表に示す信号はプログラムでキャプチャでき、信号に基づいて適切な動作をとることができる.これらの信号はC++ヘッダファイルに定義されています.
信号|記述--|SIGABRT|プログラムの異常終了、例えばabortを呼び出す.SIGFPE|誤った演算、例えばゼロで除算したり、オーバーフローを引き起こす操作.SIGILL|不正命令を検出します.SIGINT|は、インタラクション注意信号を受信する.SIGSEGV|メモリへの不正アクセス.SIGTERM|プログラムの終了要求に送信する.
Signal()関数
C++信号処理ライブラリは、バーストイベントをキャプチャするためのsignal関数を提供する.以下はsignal()関数の構文です.
void (*signal (int sig, void (*func)(int)))(int); 

この関数は2つのパラメータを受信します.
  • の最初のパラメータは、信号の番号を表す整数である.
  • の第2のパラメータは、信号処理関数を指すポインタである.

  • signal()関数を用いてSIGINT信号をキャプチャする簡単なC++プログラムを作成しましょう.プログラムでどの信号をキャプチャするかにかかわらず、signal関数を使用して信号を登録し、信号ハンドラに関連付ける必要があります.次の例を見てみましょう.例
    #include 
    #include 
     
    using namespace std;
     
    void signalHandler( int signum )
    {
        cout << "Interrupt signal (" << signum << ") received.
    "; // // exit(signum); } int main () { // SIGINT 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 
    #include 
     
    using namespace std;
     
    void signalHandler( int signum )
    {
        cout << "Interrupt signal (" << signum << ") received.
    "; // // exit(signum); } int main () { int i = 0; // SIGINT 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.
    

    コードリンク:https://github.com/karst87/cpp/tree/master/learning/com.runoob