Provided by: manpages-ja-dev_0.5.0.0.20221215+dfsg-1_all
名前
sigvec, sigblock, sigsetmask, siggetmask, sigmask - BSD 版シグナル API
書式
#include <signal.h> int sigvec(int sig, const 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) 参照): All functions shown above: Since glibc 2.19: _DEFAULT_SOURCE Glibc 2.19 and earlier: _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 でないポインターを指定すればよい。 シグナル SIGKILL と SIGSTOP に対する動作は変更できない。 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_DFL と SIG_IGN のいずれかを指定できる。 SIG_DFL はシグナルに適用されるデフォルト の動作を意味し、 SIG_IGN はシグナルを無視することを意味する。 sv_handler にシグナルハンドラーのアドレスを指定した場合、 sv_mask はハンドラーが実行中にブ ロックされるべきシグナルのマスクを指定する。 また、ハンドラーを起動したシグナル自身はブ ロックされる。 SIGKILL か SIGSTOP をブロックしようとした場合には、黙って無視される。 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) と同様)、変更前のプロセスのシグナルマスクを返す。 SIGKILL や SIGSTOP をブロックしようとした場合には、黙って無視される。 sigsetmask() 関数はプロセスのシグナルマスクを mask で指定された値に設定し (POSIX の sigprocmask(SIG_SETMASK) と同様)、変更前のプロセスのシグナルマスクを返す。 siggetmask() 関数はプロセスの現在のシグナルマスクを返す。この関数は sigblock(0) と等価で ある。
返り値
sigvec() 関数は成功すると 0 を返す。エラーの場合、-1 を返し、 errno にエラーを示す値を セットする。 sigblock() と sigsetmask() は変更前のシグナルマスクを返す。 sigmask() マクロは signum のシグナルマスクを返す。
エラー
sigaction(2) と sigprocmask(2) の「エラー」の節を参照。
バージョン
バージョン 2.21 以降では、 GNU C ライブラリはもはや sigvec() 関数を ABI の一部として公開し なくなった。 (後方互換性を保証するために、glibc のシンボルのバージョン付け機構により、 古 いバージョンのライブラリとリンクされたバイナリに対してはこのインターフェースが引き続き公開 されている。)
属性
この節で使用されている用語の説明については、 attributes(7) を参照。 ┌─────────────────────────────────┬───────────────┬─────────┐ │インターフェース │ 属性 │ 値 │ ├─────────────────────────────────┼───────────────┼─────────┤ │sigvec(), sigmask(), sigblock(), │ Thread safety │ MT-Safe │ │sigsetmask(), siggetmask() │ │ │ └─────────────────────────────────┴───────────────┴─────────┘
準拠
これらの関数のうち siggetmask() 以外の全ては 4.3BSD にあった。 siggetmask() の出自ははっ きりしない。 これらの関数は廃止予定であり、新しいプログラムでは使用しないこと。
注意
4.3BSD では、信頼性のあるシグナル処理機構を提供する (vec.sv_mask を 0 で sigvec() を呼び出 したときと同様)。 System V が提供する処理機構は信頼性のないものである。 POSIX.1 では、 signal() のこの点は規定しないままとなっている。 さらなる詳細については signal(2) を参照。 BSD と System V のどちらのシステムでも シグナルを待つために、 sigpause(3) という名前の関 数が提供されているが、 この関数の引数は両方のシステムで異なる。 詳細は sigpause(3) を参 照。
関連項目
kill(2), pause(2), sigaction(2), signal(2), sigprocmask(2), raise(3), sigpause(3), sigset(3), signal(7)
この文書について
この man ページは Linux man-pages プロジェクトのリリース 5.10 の一部である。プロジェクトの 説明とバグ報告に関する情報は https://www.kernel.org/doc/man-pages/ に書かれている。