SIGVEC(3) | Linux Programmer's Manual | SIGVEC(3) |
名前
sigvec, sigblock, sigsetmask, siggetmask, sigmask - BSD 版シグナル API書式
#include <signal.h>glibc 向けの機能検査マクロの要件 ( feature_test_macros(7) 参照):
説明
これらの関数は、昔ながらの BSD 版シグナル API を使用しているプログラムに対して互換性のあるインタフェースを glibc で提供するものである。この API は過去のものであり、新しいアプリケーションでは POSIX シグナル API ( sigaction(2), sigprocmask(2) など) を使用すべきである。
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) | sigpause(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 にエラーを示す値をセットする。エラー
sigaction(2) と sigprocmask(2) の「エラー」の節を参照。準拠
これらの関数のうち siggetmask() 以外の全ては 4.3BSD にあった。 siggetmask() の出自ははっきりしない。これらの関数は廃止予定であり、新しいプログラムでは使用しないこと。注意
4.3BSD では、信頼性のあるシグナル処理機構を提供する ( vec.sv_mask を 0 で sigvec() を呼び出したときと同様)。 System V が提供する処理機構は信頼性のないものである。 POSIX.1-2001 では、 signal() のこの点は規定しないままとなっている。さらなる詳細については signal(2) を参照。関連項目
kill(2), pause(2), sigaction(2), signal(2), sigprocmask(2), raise(3), sigpause(3), sigset(3), signal(7)この文書について
この man ページは Linux man-pages プロジェクトのリリース 3.51 の一部である。プロジェクトの説明とバグ報告に関する情報は http://www.kernel.org/doc/man-pages/ に書かれている。2012-09-06 | Linux |