名 前
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
siginfo_t: _POSIX_C_SOURCE >= 199309L
説 明
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 フ ィ ー ル ド を 規 定 し て い な い )。 こ の フ ィ ー ル ド の 詳 細 な 目 的 に つ い て は sigreturn(2) に 書 か れ て い る 。
sa_handler は signum に 対 応 す る 動 作 を 指 定 す る も の で 、 デ フ ォ ル ト の 動 作 を 行 う SIG_DFL、 そ の シ グ ナ ル を 無 視 す る SIG_IGN、 シ グ ナ ル ハ ン ド ラ ー 関 数 へ の ポ イ ン タ ー が 設 定 で き る 。 シ グ ナ ル ハ ン ド ラ ー 関 数 の 引 き 数 は 一 つ で あ り 、 シ グ ナ ル 番 号 が 引 き 数 と し て 渡 さ れ る 。
sa_flags に SA_SIGINFO が 指 定 さ れ た 場 合 、 (sa_handler で は な く ) sa_sigaction に よ り signum に 対 応 す る シ グ ナ ル ハ ン ド ラ ー 関 数 が 指 定 さ れ る 。 指 定 さ れ る 関 数 は 、 最 初 の 引 き 数 と し て シ グ ナ ル 番 号 を 、 二 番 目 の 引 き 数 と し て siginfo_t へ の ポ イ ン タ ー を 、 三 番 目 の 引 き 数 と し て (void * に キ ャ ス ト し た ) ucontext_t へ の ポ イ ン タ ー を 受 け と る 。 (一 般 的 に は 、 ハ ン ド ラ ー 関 数 の 三 番 目 の 引 き 数 が 使 用 さ れ な い 。 ucontext_t に つ い て の 詳 し い 情 報 は getcontext(3) を 参 照 。 )
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_RESTORER ア プ リ ケ
ー シ ョ ン で の
使 用 を 意 図 し
た も の で は な
い 。 こ の フ ラ
グ は C ラ イ ブ ラ
リ が sa_restorer フ ィ
ー ル ド に "signal
trampoline" の ア ド レ
ス が 入 っ て い
る こ と を 示 す
た め に 使 用 さ
れ る 。 詳 細 は
sigreturn(2) を 参 照 。
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 */
long si_band; /* Band event (was int in
glibc 2.3.2 and earlier) */
int si_fd; /* File descriptor */
short si_addr_lsb; /* Least significant bit of address
(since Linux 2.6.32) */
void *si_call_addr; /* Address of system call instruction
(since Linux 3.5) */
int si_syscall; /* Number of attempted system call
(since Linux 3.5) */
unsigned int si_arch; /* Architecture of attempted system
call
(since Linux 3.5) */ }
si_signo, si_errno, si_code は 全 て の シ グ ナ ル に 対 し て 定 義 さ れ て い る (si_errno は Linux で は 一 般 的 に は 使 用 さ れ な い )。 構 造 体 の 残 り の 部 分 は 、 共 用 体 (union) に な っ て い る か も し れ な い 。 そ の 場 合 は 該 当 す る シ グ ナ ル に お い て 意 味 の あ る フ ィ ー ル ド の み を 読 み 込 む こ と が で き る 。
* |
kill(2) や sigqueue(3) で 送 信 さ れ た シ グ ナ ル で は si_pid と si_uid が 設 定 さ れ る 。 さ ら に 、 sigqueue(3) で 送 信 さ れ た シ グ ナ ル で は si_int と si_pid に シ グ ナ ル の 送 信 者 に よ り 指 定 さ れ た 値 が 設 定 さ れ る 。 詳 細 は sigqueue(3) を 参 照 。 | ||||||||||
* |
POSIX.1b タ イ マ ー (Linux 2.6 以 降 ) は si_overrun と si_timerid を 設 定 す る 。 si_timerid フ ィ ー ル ド は カ ー ネ ル が タ イ マ ー を 特 定 す る の に 使 用 す る 内 部 ID で あ り 、 timer_create(2) が 返 す タ イ マ ー ID と 同 じ で は な い 。 si_overrun フ ィ ー ル ド は タ イ マ ー が 回 り 切 っ た 回 数 で あ る 。 こ れ は timer_getoverrun(2) の 呼 び 出 し で 取 得 で き る 情 報 と 同 じ で あ る 。 こ れ ら の フ ィ ー ル ド は 非 標 準 で Linux に よ る 拡 張 で あ る 。
メ ッ セ
ー ジ キ ュ ー の
通 知 用 に 送 信
さ れ た シ グ ナ
ル (mq_notify(3) の SIGEV_SIGNAL
の 説 明 を 参 照 )
で は 、 si_int/si_ptr
に mq_notify(3) に 渡 さ
れ た sigev_value が 設
定 さ れ る 。 si_pid
に は メ ッ セ ー
ジ 送 信 者 の プ
ロ セ ス ID が 設 定
さ れ 、 si_uid に は
メ ッ セ ー ジ 送
信 者 の 実 ユ ー
ザ ー ID が 設 定 さ
れ る 。 SIGCHLD は si_pid, si_uid, si_status, si_utime, si_stime を 設 定 し 、 子 プ ロ セ ス に 関 す る 情 報 を 提 供 す る 。 si_pid フ ィ ー ル ド は 子 プ ロ セ ス の プ ロ セ ス ID で 、 si_uid フ ィ ー ル ド は 子 プ ロ セ ス の 実 ユ ー ザ ー ID で あ る 。 si_stime フ ィ ー ル ド に は 、 (si_code が CLD_EXITED の 場 合 は ) 子 プ ロ セ ス の 終 了 ス テ ー タ ス が 、 そ れ 以 外 の 場 合 は 状 態 が 変 化 す る 原 因 と な っ た シ グ ナ ル 番 号 が 格 納 さ れ る 。 si_utime と si_stime に は 子 プ ロ セ ス が 使 用 し た ユ ー ザ ー CPU 時 間 と シ ス テ ム CPU 時 間 が そ れ ぞ れ 格 納 さ れ る 。 (getrusage(2) や times(2) と 異 な り ) こ れ ら の フ ィ ー ル ド に は wait 待 ち の 子 プ ロ セ ス に よ り 使 用 さ れ た 時 間 は 含 ま れ な い 。 2.6 よ り 前 と 2.6.27 以 降 の カ ー ネ ル で は 、 こ れ ら の フ ィ ー ル ド に 格 納 さ れ る CPU 時 間 の 単 位 は sysconf(_SC_CLK_TCK) で あ る 。 2.6.27 よ り 前 の 2.6 系 の カ ー ネ ル で は 、 バ グ が あ り 、 こ れ ら の フ ィ ー ル ド の CPU 時 間 の 単 位 が (カ ー ネ ル の コ ン フ ィ グ で 指 定 さ れ る ) シ ス テ ム の jiffy で あ っ た (time(7) 参 照 )。 * SIGILL, SIGFPE, SIGSEGV, SIGBUS, SIGTRAP で は 、 si_addr に fault が 発 生 し た ア ド レ ス が 設 定 さ れ る 。 い く つ か の ア ー キ テ ク チ ャ ー で は 、 こ れ ら の シ グ ナ ル は si_trapno フ ィ ー ル ド に も 設 定 さ れ る 。 SIGBUS が 発 生 す る エ ラ ー の い く つ か 、 特 に BUS_MCEERR_AO と BUS_MCEERR_AR で は 、 si_addr_lsb も 設 定 さ れ る 。 こ の フ ィ ー ル ド は 報 告 さ れ る ア ド レ ス の 最 下 位 ビ ッ ト を 示 し 、 こ れ に よ り メ モ リ ー 破 壊 の 程 度 を 知 る こ と が で き る 。 例 え ば 、 ペ ー ジ 全 体 が 壊 れ て い る 場 合 に は si_addr_lsb に は log2(sysconf(_SC_PAGESIZE)) が 入 る 。 SIGTRAP が ptrace(2) イ ベ ン ト (PTRACE_EVENT_foo) に 対 応 し て 配 送 さ れ る 際 、 si_addr は 設 定 さ れ な い が 、 si_pid と si_uid に は ト ラ ッ プ の 配 送 に 責 任 を 負 う プ ロ セ ス ID と ユ ー ザ ー ID が そ れ ぞ れ 格 納 さ れ る 。 seccomp(2) の 場 合 、 ト レ ー ス 対 象 は イ ベ ン ト を 配 送 し た 元 と し て 示 さ れ る 。 BUS_MCEERR_* と si_addr_lsb は Linux 固 有 の 拡 張 で あ る 。 * SIGIO/SIGPOLL (2 つ の 名 前 は Linux で は 同 義 語 ) で は si_band と si_fd が 設 定 さ れ る 。 si_band イ ベ ン ト は 、 poll(2) が revents フ ィ ー ル ド に 設 定 す る の と 同 じ 値 が 入 っ た ビ ッ ト マ ス ク で あ る 。 si_fd フ ィ ー ル ド は I/O イ ベ ン ト が 発 生 し た フ ァ イ ル デ ィ ス ク リ プ タ ー を 示 す 。 * seccomp フ ィ ル タ ー が SECCOMP_RET_TRAP を 返 す 際 に (Linux 3.5 以 降 で ) 生 成 さ れ る SIGSYS シ グ ナ ル で は 、 si_call_addr, si_syscall, si_arch, si_arch や seccomp(2) で 説 明 さ れ て い る 他 の フ ィ ー ル ド が 設 定 さ れ る 。 si_code は 、 そ の シ グ ナ ル が 送 信 さ れ た 理 由 を 示 す 値 で あ る (ビ ッ ト マ ス ク で は な い )。 ptrace(2) イ ベ ン ト で は 、 si_code に は SIGTRAP が 入 り 、 上 位 バ イ ト に は ptrace イ ベ ン ト が 入 る 。 (SIGTRAP | PTRACE_EVENT_foo << 8). 通 常 の シ グ ナ ル の 場 合 に は 、 以 下 の リ ス ト に 示 す 値 が ど の シ グ ナ ル の 場 合 で も si_code に 入 り う る 。 シ グ ナ ル が 生 成 さ れ た 理 由 も 記 載 し て い る 。 SI_USER SI_KERNEL カ
ー ネ ル に よ り
送 信 さ れ た SI_TIMER POSIX タ イ マ ー が 満 了 し た SI_MESGQ (Linux 2.6.6 以 降 ) POSIX メ ッ セ ー ジ キ ュ ー の 状 態 が 変 化 し た ; mq_notify(3) 参 照 SI_ASYNCIO 非
同 期 IO (AIO) が 完 了
し た SIGIO が キ ュ ー イ ン グ さ れ た (Linux 2.2 以 下 の カ ー ネ ル の み ; Linux 2.4 以 降 で は 以 下 で 説 明 す る SIGIO/SIGPOLL の si_code が 入 る ) SI_TKILL (Linux 2.4.19 以 降 ) SIGILL シ グ ナ ル の 場 合 、 si_code に は 以 下 の 値 が 入 る 可 能 性 が あ る : ILL_ILLOPC 不
正 な 命 令 コ ー
ド SIGFPE シ グ ナ ル の 場 合 、 si_code に は 以 下 の 値 が 入 る 可 能 性 が あ る : FPE_INTDIV 整
数 の 0 に よ る 除
算 SIGSEGV シ グ ナ ル の 場 合 、 si_code に は 以 下 の 値 が 入 る 可 能 性 が あ る : SEGV_MAPERR オ
ブ ジ ェ ク ト に
マ ッ ピ ン グ さ
れ て い な い ア
ド レ ス SIGBUS シ グ ナ ル の 場 合 、 si_code に は 以 下 の 値 が 入 る 可 能 性 が あ る : BUS_ADRALN 不
正 な ア ド レ ス
ア ラ イ メ ン ト
(alignment) SIGTRAP シ グ ナ ル の 場 合 、 si_code に は 以 下 の 値 が 入 る 可 能 性 が あ る : TRAP_BRKPT プ
ロ セ ス の ブ レ
ー ク ポ イ ン ト
SIGCHLD シ グ ナ ル の 場 合 、 si_code に は 以 下 の 値 が 入 る 可 能 性 が あ る : CLD_EXITED 子
プ ロ セ ス が 終
了 し た (exited) SIGIO/SIGPOLL シ グ ナ ル の 場 合 、 si_code に は 以 下 の 値 が 入 る 可 能 性 が あ る : POLL_IN 入
力 デ ー タ が 利
用 可 能 I/O エ ラ ー POLL_PRI 高
優 先 の 入 力 が
利 用 可 能 SIGSYS シ グ ナ ル の 場 合 、 si_code に は 以 下 の 値 が 入 る 可 能 性 が あ る : SYS_SECCOMP (Linux 3.5 以 降 ) seccomp(2) の フ ィ ル タ ー ル ー ル に よ る 配 送 さ れ た 返 り 値sigaction() 関 数 は 成 功 す る と 0 を 返 す 。 エ ラ ー の 場 合 、 −1 を 返 し 、 errno に エ ラ ー を 示 す 値 を セ ッ ト す る 。 エ ラ ー
|