sigsetmask(3) BSD 版シグナル API

Other Alias

sigvec, sigblock, siggetmask, sigmask

書式

#include <signal.h>

int sigvec(int sig, struct sigvec *vec, struct sigvec *ovec);

int sigmask(int signum);

int sigblock(int mask);

int sigsetmask(int mask);

int siggetmask(void);

glibc 向けの機能検査マクロの要件 (feature_test_macros(7) 参照):

上記の全ての関数: _BSD_SOURCE

説明

これらの関数は、昔ながらの BSD 版シグナル API を使用しているプログラム に対して互換性のあるインタフェースを glibc で提供するものである。 この API は過去のものであり、新しいアプリケーションでは POSIX シグナル API (sigaction(2), sigprocmask(2) など) を使用すべきである。

関数 sigvec() は、(POSIX の sigaction(2) と同様に) シグナル sig の動作の設定・取得を行う。 vec は、NULL 以外の場合、 sig の新しい動作を定義した sigvec 構造体へのポインタである。 ovec は、NULL 以外の場合、 sig の変更前の動作を返すために使用される sigvec 構造体へのポインタである。 sig の動作を変更せずに現在の動作を取得するためには、 vec に NULL を指定し、 ovec に NULL でないポインタを指定すればよい。

シグナル SIGKILLSIGSTOP に対する動作は変更できない。

sigvec 構造体は以下の通りである:

struct sigvec {
    void (*sv_handler)(int); /* Signal disposition */
    int    sv_mask;          /* Signals to be blocked in handler */
    int    sv_flags;         /* Flags */
};
sv_handler フィールドはシグナルの動作を指定するもので、 シグナルハンドラ関数のアドレスか、 SIG_DFLSIG_IGN のいずれかを指定できる。 SIG_DFL はシグナルに適用されるデフォルトの動作を意味し、 SIG_IGN はシグナルを無視することを意味する。

sv_handler にシグナルハンドラのアドレスを指定した場合、 sv_mask はハンドラが実行中にブロックされるべきシグナルのマスクを指定する。 また、ハンドラを起動したシグナル自身はブロックされる。 SIGKILLSIGSTOP をブロックしようとした場合には、黙って無視される。

sv_handler にシグナルハンドラのアドレスを指定した場合、 sv_flags フィールドはハンドラが呼ばれた際の挙動を制御するフラグを指定する。 このフィールドには、0 か、以下のフラグを 1個以上指定できる:

SV_INTERRUPT
シグナルハンドラが停止中のシステムコールを中断した場合、 ハンドラから復帰しても、システムコールは再開されず、 エラー EINTR で失敗する。 このフラグを指定しなかった場合、システムコールは デフォルトで再開される。
SV_RESETHAND
シグナルハンドラを呼び出す前にシグナルの動作を デフォルトにリセットする。 このフラグを指定しなかった場合、もう一度 sigvec() を呼び出して明示的に削除されるか、プロセスが execve(2) を実行するまで、ハンドラは設定されたままとなる。
SV_ONSTACK
代替シグナルスタック上でシグナルハンドラを実行する (歴史的に、BSD では代替シグナルスタックは廃止された関数 sigstack() を使って設定する。POSIX では、代わりに sigaltstack(2) を使用する)。

マクロ sigmask() は signum に対する「シグナルマスク」を構成して返す。 例えば、以下のようなコードを使うと、 sigvec() に渡す vec.sv_mask を初期化できる。

    vec.sv_mask = sigmask(SIGQUIT) | sigmask(SIGABRT);
                /* Block SIGQUIT and SIGABRT during
                   handler execution */

sigblock() 関数は、 mask にあるシグナルをプロセスのシグナルマスクに追加し (POSIX の sigprocmask(SIG_BLOCK) と同様)、変更前のプロセスのシグナルマスクを返す。 SIGKILLSIGSTOP をブロックしようとした場合には、黙って無視される。

sigsetmask() 関数はプロセスのシグナルマスクを mask で指定された値に設定し (POSIX の sigprocmask(SIG_SETMASK) と同様)、変更前のプロセスのシグナルマスクを返す。

siggetmask() 関数はプロセスの現在のシグナルマスクを返す。この関数は sigblock(0) と等価である。

返り値

sigvec() 関数は成功すると 0 を返す。エラーの場合、-1 を返し、 errno にエラーを示す値をセットする。

sigblock() と sigsetmask() は変更前のシグナルマスクを返す。

sigmask() マクロは signum のシグナルマスクを返す。

エラー

sigaction(2) と sigprocmask(2) の「エラー」の節を参照。

属性

マルチスレッディング (pthreads(7) 参照)

関数 sigvec(), sigblock(), sigsetmask(), siggetmask() はスレッドセーフである。

sigmask() マクロはスレッドセーフである。

準拠

これらの関数のうち siggetmask() 以外の全ては 4.3BSD にあった。 siggetmask() の出自ははっきりしない。 これらの関数は廃止予定であり、新しいプログラムでは使用しないこと。

注意

4.3BSD では、信頼性のあるシグナル処理機構を提供する (vec.sv_mask を 0 で sigvec() を呼び出したときと同様)。 System V が提供する処理機構は信頼性のないものである。 POSIX.1-2001 では、 signal() のこの点は規定しないままとなっている。 さらなる詳細については signal(2) を参照。

BSD と System V のどちらのシステムでも シグナルを待つために、 sigpause(3) という名前の関数が提供されているが、 この関数の引き数は両方のシステムで異なる。 詳細は sigpause(3) を参照。

この文書について

この man ページは Linux man-pages プロジェクトのリリース 3.65 の一部である。 プロジェクトの説明とバグ報告に関する情報は http://www.kernel.org/doc/man-pages/ に書かれている。