SIGACTION(2)

名前
sigaction, sigprocmask, sigpending, sigsuspend - POSIX シグナル・操作関数

書式
#include <signal.h>

int sigaction(int signum, const struct sigaction *act, struct sigaction *oldact);

int sigprocmask(int how, const sigset_t *set, sigset_t *oldset);

int sigpending(sigset_t *set);

int sigsuspend(const sigset_t *mask);

説明
sigaction システム・コールは特定のシグナルを受けた プロセスの動作を変更するのに使用する。

signum はシグナルを指定する、 SIGKILL と SIGSTOP 以外の全ての有効なシグナルが指定できる。

act が NULL でなければ signum シグナルの新しい動作として act が設定される。 oldact が NULL でなければ今までの動作が oldact に格納される。

sigaction 構造体は以下のように定義される。

    struct sigaction {
        void (*sa_handler)(int);
        sigset_t sa_mask;
        int sa_flags;
        void (*sa_restorer)(void);
    }

sa_handler は signum に設定する動作を指定し、 デフォルトの動作を指定する SIG_DFL や、 このシグナルを無視する SIG_IGN や、シグナル・ハンドラー関数へのポインターを設定する。

sa_mask はシグナル・ハンドラー実行中に禁止(block)するべきシグナルのマスクを 与える。加えて、 SA_NODEFER や SA_NOMASK フラグが使用されない限りは、ハンドラーを呼び出したシグナルも禁止される。

sa_flags はシグナル・ハンドラーの動作を修正するためのフラグの集合を指定する。 フラグは以下のゼロ個以上のフラグの ビットOR によって表現される。

    SA_NOCLDSTOP
        signum が SIGCHLD の場合に、子プロセス(child process)が停止(stop)した場合 (例えば、子プロセスが SIGSTOP, SIGTSTP, SIGTTIN, SIGTTOU を受けた場合など) の報告を受けない。

    SA_ONESHOT または SA_RESETHAND
        一度、シグナル・ハンドラーが呼ばれるとシグナルの動作をデフォルトに戻す。 (これは signal(2) システム・コールのデフォルトの動作と同じである。)

    SA_RESTART
        いくつかシステム・コールをシグナルを越えて再開できるようにす ることで BSD シグナルの方式(semantics)と互換性のある動作を提供する。

    SA_NOMASK or SA_NODEFER
        それ自身のシグナル・ハンドラーの内部にいる時でも シグナルを妨害しないようにする。

sa_restorer 要素は廃止(obsolete)されたので使用してはいけない。

sigprocmask コールは現在禁止(block)されているシグナルのリストを変更する。 コールの動作は how の値に依存し以下のようになる。

    SIG_BLOCK
        禁止されたシグナルの集合は現在の値と set 引き数に設定されたものの合成となる。

    SIG_UNBLOCK
        現在禁止されているシグナルの集合から set にあるシグナルを取り除く。禁止されていないシグナルを除こうと しても問題はない。

    SIG_SETMASK
        禁止されているシグナルの集合に set 引き数を設定する。

oldset が NULL でなければ、シグナル・マスクの今までの値を oldset に格納する。

sigpending コールは待機(pending)中のシグナル(禁止中に発生したシグナル)の検査を 行なう。待機中のシグナルのマスクは set に格納される。

sigsuspend コールは一時的にプロセスのシグナル・マスクを mask で与えられたものに置き換え、 シグナルを受けるまで、プロセスを停止(suspend)する。

返り値
sigaction, sigprocmask, sigpending sigsuspend は成功すれば 0、エラーならば -1 を返す。

エラー

EINVAL
    無効なシグナルが指定された。これは捕獲(catch)できない SIGKILL や SIGSTOP の行動を変更しようと試みた場合にも発生する。

EFAULT
    act, oldact, set または oldset の指すメモリーが正しいプロセスのアドレス空間にない。

EINTR
    システム・コールが割込まれた。

注意
sigprocmask コールで SIGKILL や SIGSTOP を禁止することはできない。そのような試みは黙って無視される。

POSIX によると、kill() や raise() 関数で生成できない SIGFPE, SIGILL, SIGSEGV シグナルを無視(ignore)した後の動作は未定義で ある。ゼロによる整数割り算の結果は未定義となる。 ある種のアーキテクチャー(architecture)ではこれは SIGFPE シグナルを生成する。 (同様に負の最大整数を -1 で割ると SIGFPE が生成されるかもしれない。) このシグナルを無視すると無限ループに落ちいるかもしれない。

POSIX (B.3.3.1.3) では SIGCHLD に SIG_IGN を設定することを許していない。 BSD と SYSV の動作は異っている。SIGCHLD の動作に SIG_IGN を設定している BSD のソフトウェアは Linux では失敗する。

POSIX の仕様では SA_NOCLDSTOP のみが定義されている。 他の sa_flags フラグを使用することは移植性(portable)がない。

SA_RESETHAND フラグは SVr4 の同じ名前のフラグと互換性(compatible)がある。

The SA_NODEFER フラグは 1.3.9 以降のカーネルでは同じ名前の SVr4 のフラグと互換性がある。 より古いカーネルでの Linux の実装では一つだけでなく全てのシグナル 受けることを許していた。(実際には sa_mask の設定により無効にできる。)

SVr4 との互換性のために名付けられた SA_RESETHAND と SA_NODEFER はライブラリーのバージョン 3.0.9 以降に存在する。

sigaction は現在のシグナル・ハンドラーを確認するために二番目の引き数に NULL を 指定して呼び出すことができる。また二番目と三番目の引き数を NULL にて 呼び出すことによって与えられたシグナルが現在のマシンで使えるかどうか チェックできる。

シグナル集合の操作に関してより詳しくは sigsetops(3) を参照すること

準拠
POSIX, SVr4. SVr4 には EINTR についての記述はない。

関連項目
kill(1), kill(2), killpg(2), pause(2), raise(3), siginterrupt(3), signal(2), signal(7), sigsetops(3), sigvec(2)