signal(3C)、sigset(3C)、signal(3UCB)、および sigvec(3UCB) すべてを使用して、シグナルハンドラをインストールできます。これらのすべては、シグナルに対する前の動作を戻します。4 つのインタフェースには、1 つの重要な違いがあります。signal(3C) は System V シグナルセマンティクスとなります (同じシグナルがそのハンドラに割り込むことができます)。sigset(3C)、signal(3UCB)、および sigvec(3UCB) は、すべて BSD シグナルセマンティクスになります (シグナルはそのハンドラが復帰するまでブロッキングされます)。さらに、signal(3C) と signal(3UCB) の両方とも、シグナルを無視するかデフォルトの動作を復元するかを制御できます。例 4-1 は、簡単なハンドラとそのインストールを示しています。
#include <stdio.h> #include <signal.h> void sigcatcher() { printf ("PID %d caught signal.¥n". getpid()); } main() { pid_t ppid; signal (SIGINT, sigcatcher); if (fork() == 0) { sleep( 5 ); ppid = getppid(); while( TRUE ) if (kill( ppid, SIGINT) == -1 ) exit( 1 ); } pause(); } |
シグナル SIGKILL または SIGSTOP に対して、ハンドラのインストールまたは SIG_IGN の設定を試みるとエラーになります。シグナル SIGCONT に対して SIG_IGN の設定を試みてもエラーになります。これはデフォルトで無視されているためです。
シグナルハンドラをインストールすると、signal(3C)、sigset(3C)、signal(3UCB)、または sigvec(3UCB) をもう一度呼び出して明示的に置き換えるまで、インストールされたままになります。