sigaction − シ グ ナ ル の 動 作 の 確 認 と 変 更
#include <signal.h>
int
sigaction(int signum, const struct sigaction
*act,
struct sigaction *oldact);
glibc 向 け の 機 能 検 査 マ ク ロ の 要 件 (feature_test_macros(7) 参 照 ):
sigaction(): _POSIX_C_SOURCE >= 1 || _XOPEN_SOURCE || _POSIX_SOURCE
sigaction() シ ス テ ム コ ー ル は 、 特 定 の シ グ ナ ル を 受 信 し た 際 の プ ロ セ ス の 動 作 を 変 更 す る の に 使 用 さ れ る (シ グ ナ ル の 概 要 に つ い て は signal(7) を 参 照 )。
signum に は 、 SIGKILL と SIGSTOP 以 外 の 有 効 な シ グ ナ ル を ど れ で も 指 定 で き る 。
act が NULL 以 外 で あ れ ば 、 シ グ ナ ル signum の 新 し い 動 作 (action) と し て act が 設 定 さ れ る 。 oldact が NULL で な け れ ば 、 今 ま で の 動 作 が oldact に 格 納 さ れ る 。
sigaction 構 造 体 は 以 下 の よ う な 感 じ に 定 義 さ れ る 。
struct
sigaction {
void (*sa_handler)(int);
void (*sa_sigaction)(int, siginfo_t *, void *);
sigset_t sa_mask;
int sa_flags;
void (*sa_restorer)(void); }; ア ー キ
テ ク チ ャ に よ
っ て は 共 用 体
(union) が 用 い ら れ
て お り 、 そ の
場 合 に は sa_handler
と sa_sigaction の 両 方
を 同 時 に 割 り
当 て る こ と は
で き な い 。
sa_restorer 要 素 は 廃 止 予 定 で あ り 使 用 す べ き で は な い 。 POSIX に は sa_restorer 要 素 に 関 す る 規 定 は な い 。
sa_handler は signum に 対 応 す る 動 作 を 指 定 す る も の で 、 デ フ ォ ル ト の 動 作 を 行 う SIG_DFL、 そ の シ グ ナ ル を 無 視 す る SIG_IGN、 シ グ ナ ル ハ ン ド ラ 関 数 へ の ポ イ ン タ が 設 定 で き る 。 シ グ ナ ル ハ ン ド ラ 関 数 の 引 き 数 は 一 つ で あ り 、 シ グ ナ ル 番 号 が 引 き 数 と し て 渡 さ れ る 。
sa_flags に SA_SIGINFO が 指 定 さ れ た 場 合 、 (sa_handler で は な く ) sa_sigaction に よ り signum に 対 応 す る シ グ ナ ル ハ ン ド ル 関 数 が 指 定 さ れ る 。 指 定 さ れ る 関 数 は 、 最 初 の 引 き 数 と し て シ グ ナ ル 番 号 を 、 二 番 目 の 引 き 数 と し て siginfo_t へ の ポ イ ン タ を 、 三 番 目 の 引 き 数 と し て (void * に キ ャ ス ト し た ) ucontext_t へ の ポ イ ン タ を 受 け と る 。
sa_mask は 、 シ グ ナ ル ・ ハ ン ド ラ 実 行 中 に 禁 止 (block) す べ き シ グ ナ ル の マ ス ク を 指 定 す る (ハ ン ド ラ 実 行 中 の シ グ ナ ル の 禁 止 は 、 シ グ ナ ル ・ ハ ン ド ラ が 起 動 さ れ た ス レ ッ ド の シ グ ナ ル の マ ス ク に 追 加 す る こ と で 行 わ れ る )。 さ ら に 、 SA_NODEFER フ ラ グ が 指 定 さ れ て い な い 場 合 は 、 ハ ン ド ラ を 起 動 す る き っ か け と な る シ グ ナ ル に も sa_mask が 適 用 さ れ る 。
sa_flags は シ グ ナ ル ・ ハ ン ド ラ の 動 作 を 変 更 す る た め の フ ラ グ の 集 合 を 指 定 す る 。 sa_flags に は 、 以 下 に 示 す フ ラ グ の (0 個 以 上 の ) 論 理 和 を と っ た も の を 指 定 す る 。
SA_NOCLDSTOP
signum が SIGCHLD の 場 合 、 子 プ ロ セ ス が 停 止 し た り (子 プ ロ セ ス が SIGSTOP, SIGTSTP, SIGTTIN, SIGTTOU を 受 け た と き ) 再 開 し た り (子 プ ロ セ ス が SIGCONT を 受 け た と き ) し た と き に SIGCHLD の 通 知 を 受 け な い 。 こ の フ ラ グ は 、 SIGCHLD に 対 し て ハ ン ド ラ を 設 定 す る 際 に の み 意 味 を 持 つ 。
SA_NOCLDWAIT (Linux 2.6 以 降 )
(Linux 2.6 以 降 ) signum が SIGCHLD の 場 合 、 子 プ ロ セ ス が 終 了 し た と き に 子 プ ロ セ ス を ゾ ン ビ プ ロ セ ス に 変 化 さ せ な い (waitpid(2) も 参 照 )。 こ の フ ラ グ は 、 SIGCHLD に 対 し て ハ ン ド ラ を 設 定 す る 際 、 も し く は そ の シ グ ナ ル の 処 理 方 法 を SIG_DFL に 設 定 す る 際 に の み 意 味 を 持 つ 。
SIGCHLD に 対 し て ハ ン ド ラ を 設 定 す る 際 に SA_NOCLDWAIT フ ラ グ を セ ッ ト し た 場 合 、 子 プ ロ セ ス が 終 了 し た 際 に SIGCHLD シ グ ナ ル が 生 成 さ れ る か ど う か は 、 POSIX.1 で は 規 定 さ れ て い な い 。 Linux で は 、 こ の 状 況 で SIGCHLD シ グ ナ ル は 生 成 さ れ る 。 い く つ か の 他 の 実 装 で は 生 成 さ れ な い 。
SA_NODEFER そ
れ 自 身 の シ グ
ナ ル ・ ハ ン ド
ラ ー の 内 部 に
い る 時 で も そ
の シ グ ナ ル を
マ ス ク し な い
よ う に す る 。
こ の フ ラ グ は
シ グ ナ ル ハ ン
ド ラ を 設 定 す
る 際 に の み 意
味 を 持 つ 。
SA_NOMASK は こ の フ
ラ グ と 同 じ 意
味 だ が 、 廃 止
さ れ て お り 、
非 標 準 で あ る
。
SA_ONSTACK
sigaltstack(2) で 提 供 さ れ る 別 の シ グ ナ ル ・ ス タ ッ ク で シ グ ナ ル ハ ン ド ラ を 呼 び 出 す 。 別 の シ グ ナ ル ・ ス タ ッ ク が 利 用 可 能 で な け れ ば 、 デ フ ォ ル ト の ス タ ッ ク が 使 用 さ れ る 。 こ の フ ラ グ は シ グ ナ ル ハ ン ド ラ を 設 定 す る 際 に の み 意 味 を 持 つ 。
SA_RESETHAND シ
グ ナ ル ハ ン ド
ラ が 呼 ば れ る
度 に 、 シ グ ナ
ル の 動 作 を デ
フ ォ ル ト に 戻
す 。 こ の フ ラ
グ は シ グ ナ ル
ハ ン ド ラ を 設
定 す る 際 に の
み 意 味 を 持 つ
。 SA_ONESHOT は こ の
フ ラ グ と 同 じ
意 味 だ が 、 廃
止 さ れ て お り
、 非 標 準 で あ
る 。
SA_RESTART い く つ か の
シ ス テ ム コ ー
ル を シ グ ナ ル
の 通 知 の 前 後
で 再 開 で き る
よ う に し て 、 BSD
シ グ ナ ル 方 式
(semantics) と 互 換 性 の
あ る 動 作 を 提
供 す る 。 こ の
フ ラ グ は シ グ
ナ ル ハ ン ド ラ
を 設 定 す る 際
に の み 意 味 を
持 つ 。 signal(7) に
書 か れ て い る
シ ス テ ム コ ー
ル の 再 開 に 関
す る 議 論 を 参
照 の こ と 。
SA_SIGINFO (Linux 2.2 以 降 ) シ
グ ナ ル ハ ン ド
ラ は 一 つ で は
な く 、 三 つ の
引 き 数 を 持 つ
。 こ の 場 合 は
sa_handler の か わ り
に sa_sigaction を 設 定
し な け れ ば な
ら な い こ の フ
ラ グ は シ グ ナ
ル ハ ン ド ラ を
設 定 す る 際 に
の み 意 味 を 持
つ 。
sa_sigaction の パ ラ メ ー タ siginfo_t は 以 下 の 要 素 を 持 つ 構 造 体 で あ る :
siginfo_t {
int si_signo; /* Signal number */
int si_errno; /* An errno value */
int si_code; /* Signal code */
int si_trapno; /* Trap number that caused
hardware-generated signal
(unused on most architectures) */
pid_t si_pid; /* Sending process ID */
uid_t si_uid; /* Real user ID of sending process */
int si_status; /* Exit value or signal */
clock_t si_utime; /* User time consumed */
clock_t si_stime; /* System time consumed */
sigval_t si_value; /* Signal value */
int si_int; /* POSIX.1b signal */
void *si_ptr; /* POSIX.1b signal */
int si_overrun; /* Timer overrun count; POSIX.1b timers */
int si_timerid; /* Timer ID; POSIX.1b timers */
void *si_addr; /* Memory location which caused fault */
int si_band; /* Band event */
int si_fd; /* File descriptor */ }
si_signo, si_errno, si_code は 全 て の シ グ ナ ル に 対 し て 定 義 さ れ て い る (si_errno は Linux で は 一 般 的 に は 使 用 さ れ な い )。 構 造 体 の 残 り の 部 分 は 、 共 用 体 (union) に な っ て い る か も し れ な い 。 そ の 場 合 は 該 当 す る シ グ ナ ル に お い て 意 味 の あ る フ ィ ー ル ド の み を 読 み 込 む こ と が で き る 。
|
* |
POSIX.1b シ グ ナ ル と SIGCHLD は si_pid と si_uid を 設 定 す る 。 | ||
|
* |
POSIX.1b タ イ マ (Linux 2.6 以 降 ) は si_overrun と si_timerid を 設 定 す る 。 si_timerid フ ィ ー ル ド は カ ー ネ ル が タ イ マ を 特 定 す る の に 使 用 す る 内 部 ID で あ り 、 timer_create(2) が 返 す タ イ マ ID と 同 じ で は な い 。 | ||
|
* |
SIGCHLD は si_status, si_utime, si_stime を 設 定 す る 。 | ||
|
* |
si_int と si_ptr は POSIX.1b シ グ ナ ル の 送 信 者 に よ っ て 指 定 さ れ る 。 詳 細 は sigqueue(2) を 参 照 の こ と 。 | ||
|
* |
SIGILL, SIGFPE, SIGSEGV, SIGBUS は si_addr に エ ラ ー が 発 生 し た ア ド レ ス を 設 定 す る 。 SIGPOLL は si_band と si_fd を 設 定 す る 。 |
si_code は 、 そ の シ グ ナ ル が 送 信 さ れ た 理 由 を 示 す 値 で あ る (ビ ッ ト マ ス ク で は な い )。 以 下 の リ ス ト に 、 ど の シ グ ナ ル の 場 合 で も si_code に 入 り う る 値 を 、 シ グ ナ ル が 生 成 さ れ た 理 由 と と も に 記 載 す る 。
|
SI_USER |
||||
|
SI_KERNEL |
カ ー ネ ル に よ り 送 信 さ れ た
|
SI_QUEUE |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
SI_TIMER |
POSIX タ イ マ が 満 了 し た | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
SI_MESGQ |
POSIX メ ッ セ ー ジ キ ュ ー の 状 態 が 変 化 し た (Linux 2.6.6 以 降 )。 mq_notify(3)参 照 。
非 同 期 IO (AIO) が 完 了 し た
ン グ さ
れ た SIGIO tkill(2) ま た は tgkill(2) (Linux 2.4.19 以 降 ) SIGILL シ グ ナ ル の 場 合 、 si_code に は 以 下 の 値 を 指 定 で き る :
グ モ ー ド
SIGFPE シ グ ナ ル の 場 合 、 si_code に は 以 下 の 値 を 指 定 で き る :
ー バ ー フ ロ ー
ー バ ー フ ロ ー
(subscript) SIGSEGV シ グ ナ ル の 場 合 、 si_code に は 以 下 の 値 を 指 定 で き る :
SIGBUS シ グ ナ ル の 場 合 、 si_code に は 以 下 の 値 を 指 定 で き る :
エ ラ ー
TRAP_BRKPT プ ロ セ ス の ブ レ ー ク ポ イ ン ト
SIGCHLD シ グ ナ ル の 場 合 、 si_code に は 以 下 の 値 を 指 定 で き る :
kill さ れ た
(stop) し た
SIGPOLL シ グ ナ ル の 場 合 、 si_code に は 以 下 の 値 を 指 定 で き る :
I/O エ ラ ー
返 り 値sigaction() は 成 功 す れ ば 0 を 返 し 、 エ ラ ー な ら ば −1 を 返 す 。 エ ラ ー
|