signal関数の使用例

#include 

#include "ourhdr.h"


/* シグナルハンドラの定義 */
static void
sig_usr(int signo)
{
     if (signo == SIGUSR1) {
          printf("received SIGUSER1\n");
     } else if (signo == SIGUSR2) {
          printf("received SIGUSER2\n");
     } else {
          err_dump("received signal %d\n", signo);
     }

     return;
}

int
main(void)
{
     /* シグナルハンドラを設定する。signal()は戻り値として今までのシグナルハンド
      * ラもしくはSIG_ERRを返す。
      */
     if (signal(SIGUSR1, sig_usr) == SIG_ERR) {
          err_sys("cat't catch SIGUSER1");
     }
     if (signal(SIGUSR2, sig_usr) == SIG_ERR) {
          err_sys("cat't catch SIGUSER2");
     }

     for (;;) {
          pause();
     }
}

=========================

$ ./a.out &
[1] 26081
$ kill -USR1 26081
$ received SIGUSER1
$ kill -USR2 26081
$ received SIGUSER2
$ kill 26081
[1]+  終了しました      ./a.out

※注意上記では実験的にシグナルハンドラ内でprintfを使用しているが、実際には使用してはならない。シグナルハンドラで使って良いのは、リエントラント関数またはシグナルが割り込めない関数のみである。シグナルハンドラ内で使用可能な関数は、必ずマニュアルなどで確認すること

また、実際にはsignal()ではなくより信頼性が高いといわれるsigaction()を使用することが推奨される。