[ C言語 ] 「Ctrl + C」 でプログラムを終了させないようにする ( SIGINT )

Pocket

Unix の C 言語で作成したアプリケーションは、デフォルト動作では実行中に シェルから 「Ctrl + C」が入力されるとプログラムは終了します。ここでは、そのデフォルト動作を無効にしてアプリケーションを終了させないサンプルコードを掲載しています。なお、本サンプルの動作確認は Solaris10 で行っています。

スポンサーリンク

概要説明

「Ctrl + C」によって内部では、シグナル(SIGINT)が発生します。そして、シグナルハンドラの デフォルト動作(プロセスの終了)が実行されます。従って、このシグナルを無視することによってプロセスを終了させないようにすることができます。

サンプルコード

#include <stdio.h>
#include <signal.h>

// (未使用)シグナルハンドラ
void signal_handler()
{
    printf("called handler\n");
}

int main(int argc, char** argv)
{
    struct sigaction sa;
    // 初期化
    memset( &sa, 0, sizeof(struct sigaction) );

    /*
     * シグナルを単純に無視する場合
     */
    sa.sa_handler = SIG_IGN;
    // シグナルをフックして別処理を行う場合
    //sa.sa_handler = signal_handler; // シグナルハンドラ関数のアドレス
    sa.sa_flags |= SA_RESTART;

    // シグナルハンドラの設定
    if( sigaction( SIGINT, &sa, NULL ) < 0 ) {
        perror("sigaction");
    }

    // プログラムでシグナルを発生させる場合
    raise(SIGINT);

    // 動作確認用にちょっと待機
    sleep(30);

    return 0;
}

シグナルの発生方法

上記サンプルコードでは、raise 関数と「Ctrl + C」によってシグナル(SIGINT)を発生させていますが、kill コマンドによってもシグナルを発生させることができます。プロセスIDは ps コマンドで確認できます。

kill -SIGINT (プロセスID)

シグナル一覧 ( Solaris10 )

SIGINT(2) 以外のシグナルも多く存在し、kill コマンドによって一覧を取得することができます。

kill -l
 1) SIGHUP       2) SIGINT       3) SIGQUIT      4) SIGILL
 5) SIGTRAP      6) SIGABRT      7) SIGEMT       8) SIGFPE
 9) SIGKILL     10) SIGBUS      11) SIGSEGV     12) SIGSYS
13) SIGPIPE     14) SIGALRM     15) SIGTERM     16) SIGUSR1
17) SIGUSR2     18) SIGCHLD     19) SIGPWR      20) SIGWINCH
21) SIGURG      22) SIGIO       23) SIGSTOP     24) SIGTSTP
25) SIGCONT     26) SIGTTIN     27) SIGTTOU     28) SIGVTALRM
29) SIGPROF     30) SIGXCPU     31) SIGXFSZ     32) SIGWAITING
33) SIGLWP      34) SIGFREEZE   35) SIGTHAW     36) SIGCANCEL
37) SIGLOST     41) SIGRTMIN    42) SIGRTMIN+1  43) SIGRTMIN+2
44) SIGRTMIN+3  45) SIGRTMAX-3  46) SIGRTMAX-2  47) SIGRTMAX-1
48) SIGRTMAX
参考
スポンサーリンク


Pocket

Leave a Comment

Your email address will not be published. Required fields are marked *