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