sigaction(2) FreeBSD 一般コマンドマニュアル

sigaction

前のページ 上に戻る 次のページ

sigaction




書式

     #include <signal.h>
     struct sigaction {
             /*
              * SA_SIGINFO フラグが使用されていない場合の
              * SIG_DFL および SIG_IGN 用のシグナルハンドラ関数
              */
             void     (*sa_handler)(int);

             /* SA_SIGINFO フラグを使用する場合のシグナルハンドラ関数 */
             void     (*sa_sigaction)(int, siginfo_t *, void *);

             sigset_t sa_mask;            /* 適用するシグナルマスク */
             int      sa_flags;           /* 後述のシグナルオプション参照 */
     };

     int
     sigaction(int sig, const struct sigaction *act, struct sigaction *oact);


解説

     システムではシグナルの集合を定義しており、これらはプロセスに配信されるこ
     とがあります。シグナルの配信は、ハードウェア割込みの発生に似ています。通
     常の場合、シグナルのさらなる発生はブロックされ、現在のプロセスコンテキス
     トは保存されて、新しいプロセスコンテキストが作成されます。プロセスは、シ
     グナルの配信先 handler を指定することもあれば、シグナルを 無視することを
     指定することもあります。シグナルが発生した場合に、システムがデフォルトの
     アクションを取ることを指定することも可能です。シグナルが ブロックされるこ
     ともあり、その場合、シグナルの配信は、 ブロックが解除されるまで延期されま
     す。配信時に取るアクションは、配信時に決まります。通常の場合は、シグナル
     ハンドラが、プロセスの現行スタックで動作します。これはハンドラごとに変更
     可能であり、変更すれば、シグナルは特殊な シグナルスタックで実行可能です。

     通常の場合、シグナルルーチンは、呼び出しの原因となったシグナルがブロック
     された状態で動作しますが、その他のシグナルが発生する可能性はあります。グ
     ローバルの シグナルマスクには、プロセスへの配信が現在ブロックされているシ
     グナルの集合が定義されています。プロセスのシグナルマスクは、親のシグナル
     マスクで初期化されます (通常は空)。 sigprocmask(2) が呼び出された場合、ま
     たはシグナルがプロセスに配信された場合に、シグナルマスクは変更されます。

     あるシグナルの生起条件がプロセスで発生すると、そのシグナルが、プロセスで
     保留中のシグナルの集合に追加されます。そのシグナルがプロセスで現在 ブロッ
     クされていない場合は、プロセスに配信されます。シグナルは、プロセスがオペ
     レーティングシステムに入っている間に (システム呼び出し、ページエラーやト
     ラップ、クロック割込み中などに) 配信されます。複数のシグナルの配信準備が
     同時に整った場合は、トラップで生じたシグナルが先に配信されます。その他の
     シグナルは、それぞれが前のシグナルのハンドラに対し、最初の命令の前に割り
     込んだ状態で同時に処理されます。保留になっているシグナルの集合は、
     sigpending(2) 関数で返されます。捕捉されたシグナルが配信されると、プロセ
     スの現在の状態が保存され、新しいシグナルマスクが以下で説明するように算出
     されて、シグナルハンドラが呼び出されます。ハンドラの呼び出しは、シグナル
     処理ルーチンが正常に戻った場合に、プロセスがシグナル配信前のコンテキスト
     シグナルハンドラが設置されると、通常の場合は sigaction() を再度呼び出すか
     execve(2) を実行するまで、そのシグナルハンドラは設置されたままです。
     sa_handler を SIG_DFL に設定することで、シグナルごとに固有なデフォルトア
     クションにリセットすることができます。デフォルトとは、プロセスの終了 (コ
     アダンプが取られることもあります)、アクションなし、プロセスの停止、プロセ
     スの継続です。それぞれのシグナルのデフォルトアクションについては、下記の
     シグナルリストを参照してください。 sa_handler が SIG_DFL である場合、シグ
     ナルのデフォルトアクションはシグナルの破棄になります。また、シグナルが保
     留になっている場合でも、シグナルがマスクされていても保留中のシグナルは破
     棄されます。 sa_handler を SIG_IGN に設定すると、現在のシグナル実体と保留
     中のシグナル実体は無視されて破棄されます。

     オプションは、 sa_flags を設定することで指定できます。それぞれのビットの
     意味は以下のとおりです。

           SA_NOCLDSTOP    SIGCHLD シグナルの受信関数を設置する場合にこのビッ
                           トを設定すると、子プロセスが停止したときではなく、
                           子プロセスが終了するときにのみ、 SIGCHLD シグナルが
                           生成されます。

           SA_NOCLDWAIT    SIGCHLD シグナルで sigaction() を呼び出す場合にこの
                           ビットを設定すると、システムは、呼び出し側プロセス
                           の子プロセスが終了したときにゾンビプロセスを作成し
                           なくなります。そのあと、呼び出し側プロセスが
                           wait(2) かそれに相当する関数を実行すると、呼び出し
                           側プロセスのすべての子プロセスが終了するまでブロッ
                           クし、次に errno を ECHILD に設定して -1 を返しま
                           す。

           SA_ONSTACK      このビットを設定すると、システムは、 sigaltstack(2)
                           で指定された シグナルスタックの上で、プロセスにシグ
                           ナルを配信します。

           SA_NODEFER      このビットを設定すると、配信済みシグナルのさらなる
                           発生が、ハンドラの実行中にマスクされなくなります。

           SA_RESETHAND    このビットを設定すると、シグナルが配信された瞬間
                           に、ハンドラが SIG_DFL にリセットされます。

           SA_SIGINFO      このビットが設定されている場合、ハンドラ関数は、
                           sigaction 構造体の sa_sigaction メンバが指すものと
                           見なします。ハンドラ関数は、先に示したプロトタイプ
                           もしくは後で示す 使用例に一致しなくてはなりません。
                           このビットは、 SIG_DFL もしくは SIG_IGN を割り当て
                           る時には設定してはいけません。

     次に挙げるシステムコールの実行中にシグナルが捕捉されると、そのシステムコ
     ールの呼び出しは、エラー EINTR で強制終了されるか、要求より短いデータ転送
     で戻るか、または再開されます。保留中のシステムコールの再開は、 sa_flags
     で SA_RESTART ビットを設定することで要求できます。影響を受けるシステムコ
     ールは、通信チャネルか遅いデバイス (端末など、通常ファイルではないもの)
     に対する open(2), read(2), write(2), sendto(2), recvfrom(2), sendmsg(2),
     <signal.h> にあるものと同じです。

     B>名B>称            B>デB>フB>ォB>ルB>トB>アB>クB>シB>ョB>ン    B>説B>明
     SIGHUP          プロセスの終了          端末ラインのハングアップ
     SIGINT          プロセスの終了          プログラムの割込み
     SIGQUIT         コアイメージの作成      プログラムの中断終了
     SIGILL          コアイメージの作成      不正な命令
     SIGTRAP         コアイメージの作成      トラップのトレース
     SIGABRT         コアイメージの作成      abort(3) の呼び出し (以前の
                                             SIGIOT)
     SIGEMT          コアイメージの作成      命令実行のエミュレート
     SIGFPE          コアイメージの作成      浮動小数例外
     SIGKILL         プロセスの終了          プログラムの強制終了
     SIGBUS          コアイメージの作成      バスエラー
     SIGSEGV         コアイメージの作成      セグメンテーション違反
     SIGSYS          コアイメージの作成      存在しないシステムコールの呼び出
                                             し
     SIGPIPE         プロセスの終了          読取り側がないパイプへの書込み
     SIGALRM         プロセスの終了          リアルタイムタイマの満了
     SIGTERM         プロセスの終了          ソフトウェア終了シグナル
     SIGURG          シグナルの破棄          緊急状況がソケットに発生
     SIGSTOP         プロセスの停止          停止 (捕捉も無視もできません)
     SIGTSTP         プロセスの停止          キーボードから生成された停止シグ
                                             ナル
     SIGCONT         シグナルの破棄          停止後の継続
     SIGCHLD         シグナルの破棄          子プロセスの状態変化
     SIGTTIN         プロセスの停止          バックグラウンドプロセスが制御端
                                             末から読取りしようとした
     SIGTTOU         プロセスの停止          バックグラウンドプロセスが制御端
                                             末に書込みしようとした
     SIGIO           シグナルの破棄          記述子への  I/O 可能 ( fcntl(2)
                                             参照)
     SIGXCPU         プロセスの終了          cpu 制限時間の超過 ( setrlimit(2)
                                             参照)
     SIGXFSZ         プロセスの終了          ファイルサイズ制限の超過 (
                                             setrlimit(2) 参照)
     SIGVTALRM       プロセスの終了          仮想時間アラーム ( setitimer(2)
                                             参照)
     SIGPROF         プロセスの終了          プロファイリングタイマアラーム (
                                             setitimer(2) 参照)
     SIGWINCH        シグナルの破棄          ウィンドウサイズの変化
     SIGINFO         シグナルの破棄          キーボードからのステータス要求
     SIGUSR1         プロセスの終了          ユーザ定義シグナル 1
     SIGUSR2         プロセスの終了          ユーザ定義シグナル 2


     act に指定する sa_mask フィールドでは、 SIGKILL や SIGSTOP をブロックでき
     ません。ブロックしようとしても無視されます。

     以下の関数は、再入的であるかシグナルで割り込まれることがないかのどちらか
     で、非同期シグナルでも安全です。このため、アプリケーションは、シグナル受
     信関数から制限なく呼び出せます。
     uname(), unlink(), utime(), wait(), waitpid(), write()

     リアルタイムインタフェース

     aio_error(), clock_gettime(), sigpause(), timer_getoverrun(),
     aio_return(), fdatasync(), sigqueue(), timer_gettime(), aio_suspend(),
     sem_post(), sigset(), timer_settime()

     上のリストに記載されていないすべての関数は、シグナルに関して安全でないと
     考えられます。つまり、そのような関数がシグナルハンドラから呼び出されると
     きの動作は、未定義です。


戻り値

     関数 sigaction() は、処理が成功すると値 0 を返します。そうでない場合、値
     -1 が返され、グローバル変数 errno が設定されてエラーを示します。


使用例

     ハンドラが一致する可能性のあるプロトタイプは 3 つあります。

           ANSI C:
                  void handler(int);

           伝統的な BSD スタイル:
                  void handler(int, int code, struct sigcontext *scp);

           POSIX の SA_SIGINFO:
                  void handler(int, siginfo_t *info, void *context);

     フラグ中で SA_SIGINFO ビットが設定されている場合、ハンドラ関数は SA_SIG-
     INFO プロトタイプに一致しなくてはなりません。その場合、 sigaction 構造体
     の sa_sigaction メンバがハンドラ関数を指していなければなりません。この方
     法で SIG_DFL あるいは SIG_IGN を割り当ててはいけないことに注意してくださ
     い。

     SA_SIGINFO フラグが設定されていない場合、ハンドラ関数は ANSI C もしくは伝
     統的な BSD プロトタイプのどちらかに一致しなくてはならず、 sigaction 構造
     体の sa_handler メンバがハンドラ関数をさしていなければなりません。実際に
     は、 FreeBSD は常に後者である BSD プロトタイプの 3 つの引数を送りますし、
     ANSI C プロトタイプはそのサブセットになっていますので、どちらでも動作しま
     す。 FreeBSD インクルードファイルの sa_handler メンバ宣言は、(POSIX の要
     求に従い) ANSI C のものです。そのため、 BSD スタイルの関数のポインタの場
     合、警告メッセージを無くしてコンパイルするにはキャストする必要がありま
     す。伝統的な BSD スタイルは移植性がなく、その機能性も SA_SIGINFO ハンドラ
     の完全な部分集合になっていますので、 BSD スタイルを使うことは推奨されてい
     ません。

     sig 引数はシグナル番号で、<signal.h> の SIG... 値のうちの 1 つです。 BSD
     スタイルのハンドラの code 引数および SA_SIGINFO ハンドラへの info 引数の
     si_code メンバには、シグナルの発生理由を説明した数値コードが含まれていま
     す。通常、この数値コードは <sys/signal.h> にある SI_... 値の 1 つである
     か、もしくはシグナルに特化したコード、すなわち SIGFPE に対する FPE_... 値
     です。 BSD スタイルのハンドラの scp 引数は sigcontext 構造体のインスタン
     [EINVAL]           SIGKILL か SIGSTOP のハンドラを無視するか提供しようと
                        しました。


規格

     sigaction() 関数呼び出しは、 ISO/IEC 9945-1:1990 (``POSIX.1'') に準拠して
     います。 SA_ONSTACK フラグと SA_RESTART フラグは、Berkeley の拡張機能で
     す。 SIGTRAP, SIGEMT, SIGBUS, SIGSYS, SIGURG, SIGIO, SIGXCPU, SIGXFSZ,
     SIGVTALRM, SIGPROF, SIGWINCH, SIGINFO シグナルも同様です。これらのシグナ
     ルは、 BSD から派生したシステムのほとんどで使用できます。 SA_NODEFER フラ
     グと SA_RESETHAND フラグは、その他のオペレーティングシステムとの下位互換
     性を保つためのものです。 SA_NOCLDSTOP フラグと SA_NOCLDWAIT フラグは、そ
     の他のオペレーティングシステムで一般的に見られるオプションです。


関連項目

     kill(1), kill(2), ptrace(2), sigaltstack(2), sigblock(2), sigpause(2),
     sigpending(2), sigprocmask(2), sigsetmask(2), sigsuspend(2), sigvec(2),
     wait(2), fpsetmask(3), setjmp(3), siginterrupt(3), sigsetops(3), tty(4)

FreeBSD 4.4                      April 3, 1994                     FreeBSD 4.4

ABELNET VPSサービス