sigvec - ライブラリコールの説明 - Linux コマンド集 一覧表
- 名前
- 書式
- 説明
- 返り値
- エラー
- 注意
- 準拠
- 関連項目
名前
sigvec, sigblock, sigsetmask, siggetmask, sigmask - BSD 版シグナル API
書式
#define _BSD_SOURCE
#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);
説明
これらの関数は、昔ながらの 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)(); /* 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
()を使用する)。
関数
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
にエラーを示す値をセットする。
sigblock
()と
sigsetmask
()は変更前のシグナルマスクを返す。
sigmask
()関数は
signum
のシグナルマスクを返す。
エラー
注意
4.3BSD では、信頼性のあるシグナル処理機構を提供する
(
vec.sv_mask
を 0 で
sigvec
()を呼び出したときと同様)。
System V が提供する処理機構は信頼性のないものである。
POSIX.1-2001 では、
signal
()のこの点は規定しないままとなっている。
さらなる詳細については
signal
(2) を参照。
BSD と System V のどちらのシステムでも
シグナルを待つために、
sigpause
()という名前の関数が提供されているが、
この関数の引き数は両方のシステムで異なる。
詳細は
sigpause
(3) を参照。
準拠
これらの関数のうち
siggetmask
()以外の全ては 4.3BSD にあった。
siggetmask
()の出自ははっきりしない。
これらの関数は廃止予定であり、新しいプログラムでは使用しないこと。
関連項目
- Linux Tips 関連記事
- Linux Tips(目次)
- Linux ディストリビューション一覧
- rpm のファイル名にあるi386とかi686とは
- 自分のマシンの情報を調べる
- cron の設定
- ssh の root ログインを禁止する
- ssh を、ユーザ、IPでアクセス制限
- 鍵交換方式によるssh接続
- 鍵交換方式によるssh接続( windowsから )
- 複数ファイル内の文字列を置換して上書き保存する
- あるグループをイニシャルグループとするユーザー一覧出力
- 複数ファイルのファイル名を一括変換する
- 連番ファイルをコマンド一発で作成する
- 中身がランダムなファイルを任意のサイズで作成する
- Linux ユーザーアカウントをロック・アンロックする