Manpages

名 前

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 に は 、 SIGKILLSIGSTOP 以 外 の 有 効 な シ グ ナ ル を ど れ で も 指 定 で き る 。

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_handlersa_sigaction の 両 方 を 同 時 に 割 り 当 て る こ と は で き な い 。

sa_restorer は ア プ リ ケ ー シ ョ ン が 使 用 す る こ と を 意 図 し た フ ィ ー ル ド で は な い (POSIX は sa_restorer フ ィ ー ル ド を 規 定 し て い な い )。 こ の フ ィ ー ル ド の 詳 細 な 目 的 に つ い て は sigreturn(2) に 書 か れ て い る 。

sa_handlersignum に 対 応 す る 動 作 を 指 定 す る も の で 、 デ フ ォ ル ト の 動 作 を 行 う SIG_DFL、 そ の シ グ ナ ル を 無 視 す る SIG_IGN、 シ グ ナ ル ハ ン ド ラ ー 関 数 へ の ポ イ ン タ ー が 設 定 で き る 。 シ グ ナ ル ハ ン ド ラ ー 関 数 の 引 き 数 は 一 つ で あ り 、 シ グ ナ ル 番 号 が 引 き 数 と し て 渡 さ れ る 。

sa_flagsSA_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

signumSIGCHLD の 場 合 、 子 プ ロ セ ス が 停 止 し た り (子 プ ロ セ ス が SIGSTOP, SIGTSTP, SIGTTIN, SIGTTOU を 受 け た と き ) 再 開 し た り (子 プ ロ セ ス が SIGCONT を 受 け た と き ) し た と き に SIGCHLD の 通 知 を 受 け な い 。 こ の フ ラ グ は 、 SIGCHLD に 対 し て ハ ン ド ラ ー を 設 定 す る 際 に の み 意 味 を 持 つ 。

SA_NOCLDWAIT (Linux 2.6 以 降 )

(Linux 2.6 以 降 ) signumSIGCHLD の 場 合 、 子 プ ロ セ ス が 終 了 し た と き に 子 プ ロ セ ス を ゾ ン ビ プ ロ セ ス に 変 化 さ せ な い (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_pidsi_uid が 設 定 さ れ る 。 さ ら に 、 sigqueue(3) で 送 信 さ れ た シ グ ナ ル で は si_intsi_pid に シ グ ナ ル の 送 信 者 に よ り 指 定 さ れ た 値 が 設 定 さ れ る 。 詳 細 は sigqueue(3) を 参 照 。

*

POSIX.1b タ イ マ ー (Linux 2.6 以 降 ) は si_overrunsi_timerid を 設 定 す る 。 si_timerid フ ィ ー ル ド は カ ー ネ ル が タ イ マ ー を 特 定 す る の に 使 用 す る 内 部 ID で あ り 、 timer_create(2) が 返 す タ イ マ ー ID と 同 じ で は な い 。 si_overrun フ ィ ー ル ド は タ イ マ ー が 回 り 切 っ た 回 数 で あ る 。 こ れ は timer_getoverrun(2) の 呼 び 出 し で 取 得 で き る 情 報 と 同 じ で あ る 。 こ れ ら の フ ィ ー ル ド は 非 標 準 で Linux に よ る 拡 張 で あ る 。

*

メ ッ セ ー ジ キ ュ ー の 通 知 用 に 送 信 さ れ た シ グ ナ ル (mq_notify(3) の SIGEV_SIGNAL の 説 明 を 参 照 ) で は 、 si_int/si_ptrmq_notify(3) に 渡 さ れ た sigev_value が 設 定 さ れ る 。 si_pid に は メ ッ セ ー ジ 送 信 者 の プ ロ セ ス ID が 設 定 さ れ 、 si_uid に は メ ッ セ ー ジ 送 信 者 の 実 ユ ー ザ ー ID が 設 定 さ れ る 。
*

SIGCHLDsi_pid, si_uid, si_status, si_utime, si_stime を 設 定 し 、 子 プ ロ セ ス に 関 す る 情 報 を 提 供 す る 。 si_pid フ ィ ー ル ド は 子 プ ロ セ ス の プ ロ セ ス ID で 、 si_uid フ ィ ー ル ド は 子 プ ロ セ ス の 実 ユ ー ザ ー ID で あ る 。 si_stime フ ィ ー ル ド に は 、 (si_codeCLD_EXITED の 場 合 は ) 子 プ ロ セ ス の 終 了 ス テ ー タ ス が 、 そ れ 以 外 の 場 合 は 状 態 が 変 化 す る 原 因 と な っ た シ グ ナ ル 番 号 が 格 納 さ れ る 。 si_utimesi_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_AOBUS_MCEERR_AR で は 、 si_addr_lsb も 設 定 さ れ る 。 こ の フ ィ ー ル ド は 報 告 さ れ る ア ド レ ス の 最 下 位 ビ ッ ト を 示 し 、 こ れ に よ り メ モ リ ー 破 壊 の 程 度 を 知 る こ と が で き る 。 例 え ば 、 ペ ー ジ 全 体 が 壊 れ て い る 場 合 に は si_addr_lsb に は log2(sysconf(_SC_PAGESIZE)) が 入 る 。 SIGTRAPptrace(2) イ ベ ン ト (PTRACE_EVENT_foo) に 対 応 し て 配 送 さ れ る 際 、 si_addr は 設 定 さ れ な い が 、 si_pidsi_uid に は ト ラ ッ プ の 配 送 に 責 任 を 負 う プ ロ セ ス ID と ユ ー ザ ー ID が そ れ ぞ れ 格 納 さ れ る 。 seccomp(2) の 場 合 、 ト レ ー ス 対 象 は イ ベ ン ト を 配 送 し た 元 と し て 示 さ れ る 。 BUS_MCEERR_*si_addr_lsb は Linux 固 有 の 拡 張 で あ る 。

*

SIGIO/SIGPOLL (2 つ の 名 前 は Linux で は 同 義 語 ) で は si_bandsi_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_archseccomp(2) で 説 明 さ れ て い る 他 の フ ィ ー ル ド が 設 定 さ れ る 。

si_code は 、 そ の シ グ ナ ル が 送 信 さ れ た 理 由 を 示 す 値 で あ る (ビ ッ ト マ ス ク で は な い )。 ptrace(2) イ ベ ン ト で は 、 si_code に は SIGTRAP が 入 り 、 上 位 バ イ ト に は ptrace イ ベ ン ト が 入 る 。

(SIGTRAP | PTRACE_EVENT_foo << 8). 通 常 の シ グ ナ ル の 場 合 に は 、 以 下 の リ ス ト に 示 す 値 が ど の シ グ ナ ル の 場 合 で も si_code に 入 り う る 。 シ グ ナ ル が 生 成 さ れ た 理 由 も 記 載 し て い る 。

SI_USER

kill(2)

SI_KERNEL カ ー ネ ル に よ り 送 信 さ れ た
SI_QUEUE

sigqueue(3)

SI_TIMER

POSIX タ イ マ ー が 満 了 し た

SI_MESGQ (Linux 2.6.6 以 降 )

POSIX メ ッ セ ー ジ キ ュ ー の 状 態 が 変 化 し た ; mq_notify(3) 参 照

SI_ASYNCIO 非 同 期 IO (AIO) が 完 了 し た
SI_SIGIO

SIGIO が キ ュ ー イ ン グ さ れ た (Linux 2.2 以 下 の カ ー ネ ル の み ; Linux 2.4 以 降 で は 以 下 で 説 明 す る SIGIO/SIGPOLLsi_code が 入 る )

SI_TKILL (Linux 2.4.19 以 降 )

tkill(2) ま た は tgkill(2)

SIGILL シ グ ナ ル の 場 合 、 si_code に は 以 下 の 値 が 入 る 可 能 性 が あ る :

ILL_ILLOPC 不 正 な 命 令 コ ー ド
ILL_ILLOPN
不 正 な オ ペ ラ ン ド
ILL_ILLADR
不 正 な ア ド レ ッ シ ン グ モ ー ド
ILL_ILLTRP
不 正 な ト ラ ッ プ
ILL_PRVOPC
特 権 が 必 要 な 命 令 コ ー ド
ILL_PRVREG
特 権 が 必 要 な レ ジ ス タ ー
ILL_COPROC
コ プ ロ セ ッ サ の エ ラ ー
ILL_BADSTK
内 部 ス タ ッ ク エ ラ ー

SIGFPE シ グ ナ ル の 場 合 、 si_code に は 以 下 の 値 が 入 る 可 能 性 が あ る :

FPE_INTDIV 整 数 の 0 に よ る 除 算
FPE_INTOVF
整 数 の オ ー バ ー フ ロ ー
FPE_FLTDIV
浮 動 小 数 点 の 0 に よ る 除 算
FPE_FLTOVF
浮 動 小 数 点 の オ ー バ ー フ ロ ー
FPE_FLTUND
浮 動 小 数 点 の ア ン ダ ー フ ロ ー
FPE_FLTRES
浮 動 小 数 点 の 不 正 確 な 演 算 結 果 (inexact result)
FPE_FLTINV
浮 動 小 数 点 の 不 正 な 操 作
FPE_FLTSUB
範 囲 外 の 添 字 (subscript)

SIGSEGV シ グ ナ ル の 場 合 、 si_code に は 以 下 の 値 が 入 る 可 能 性 が あ る :

SEGV_MAPERR オ ブ ジ ェ ク ト に マ ッ ピ ン グ さ れ て い な い ア ド レ ス
SEGV_ACCERR
マ ッ ピ ン グ さ れ た オ ブ ジ ェ ク ト に 対 す る ア ク セ ス 許 可 が な い

SIGBUS シ グ ナ ル の 場 合 、 si_code に は 以 下 の 値 が 入 る 可 能 性 が あ る :

BUS_ADRALN 不 正 な ア ド レ ス ア ラ イ メ ン ト (alignment)
BUS_ADRERR
存 在 し な い 物 理 ア ド レ ス
BUS_OBJERR
オ ブ ジ ェ ク ト 固 有 の ハ ー ド ウ ェ ア エ ラ ー
BUS_MCEERR_AR
(Linux 2.6.32 以 降 ) マ シ ン チ ェ ッ ク で 使 用 中 の ハ ー ド ウ ェ ア メ モ リ ー の エ ラ ー が 検 出 さ れ た 。 対 応 が 必 須 。
BUS_MCEERR_AO
(Linux 2.6.32 以 降 ) 実 行 中 に ハ ー ド ウ ェ ア メ モ リ ー エ ラ ー が 検 出 さ れ た が 、 使 用 中 の メ モ リ ー で は な い 。 対 応 は 必 須 で は な い 。

SIGTRAP シ グ ナ ル の 場 合 、 si_code に は 以 下 の 値 が 入 る 可 能 性 が あ る :

TRAP_BRKPT プ ロ セ ス の ブ レ ー ク ポ イ ン ト
TRAP_TRACE
プ ロ セ ス の ト レ ー ス ト ラ ッ プ
TRAP_BRANCH
(Linux 2.4 以 降 ) プ ロ セ ス の ブ ラ ン チ ト ラ ッ プ
TRAP_HWBKPT
(Linux 2.4 以 降 ) ハ ー ド ウ ェ ア の ブ レ ー ク ポ イ ン ト /ウ ォ ッ チ ポ イ ン ト

SIGCHLD シ グ ナ ル の 場 合 、 si_code に は 以 下 の 値 が 入 る 可 能 性 が あ る :

CLD_EXITED 子 プ ロ セ ス が 終 了 し た (exited)
CLD_KILLED
子 プ ロ セ ス が kill さ れ た
CLD_DUMPED
子 プ ロ セ ス が 異 常 終 了 し た
CLD_TRAPPED
ト レ ー ス 対 象 の 子 プ ロ セ ス が ト ラ ッ プ を 上 げ た
CLD_STOPPED
子 プ ロ セ ス が 停 止 (stop) し た
CLD_CONTINUED
(Linux 2.6.9 以 降 ) 停 止 し て い た 子 プ ロ セ ス が 再 開 し た

SIGIO/SIGPOLL シ グ ナ ル の 場 合 、 si_code に は 以 下 の 値 が 入 る 可 能 性 が あ る :

POLL_IN 入 力 デ ー タ が 利 用 可 能
POLL_OUT
出 力 バ ッ フ ァ ー が 利 用 可 能
POLL_MSG
入 力 メ ッ セ ー ジ が 利 用 可 能
POLL_ERR

I/O エ ラ ー

POLL_PRI 高 優 先 の 入 力 が 利 用 可 能
POLL_HUP
デ バ イ ス が 接 続 さ れ て い な い

SIGSYS シ グ ナ ル の 場 合 、 si_code に は 以 下 の 値 が 入 る 可 能 性 が あ る :

SYS_SECCOMP (Linux 3.5 以 降 )

seccomp(2) の フ ィ ル タ ー ル ー ル に よ る 配 送 さ れ た

返 り 値

sigaction() 関 数 は 成 功 す る と 0 を 返 す 。 エ ラ ー の 場 合 、 −1 を 返 し 、 errno に エ ラ ー を 示 す 値 を セ ッ ト す る 。

エ ラ ー

EFAULT

actoldact が 指 し て い る メ モ リ ー が 正 し い プ ロ セ ス の ア ド レ ス 空 間 に な い 。

EINVAL

無 効 な シ グ ナ ル が 指 定 さ れ た 。 補 足 (catch) し た り 無 視 し た り で き な い シ グ ナ ル で あ る SIGKILLSIGSTOP に 対 す る 動 作 を 変 更 し よ う と し た 場 合 に も 発 生 す る 。

準 拠

POSIX.1−2001, SVr4.

注 意

fork(2) 経 由 で 作 成 さ れ た 子 プ ロ セ ス は 、 親 プ ロ セ ス の シ グ ナ ル の 処 理 方 法 の コ ピ ー を 継 承 す る 。 execve(2) の 前 後 で 、 ハ ン ド ラ ー が 設 定 さ れ て い る シ グ ナ ル の 処 理 方 法 は デ フ ォ ル ト に リ セ ッ ト さ れ 、 無 視 が 設 定 さ れ て い る シ グ ナ ル の 処 理 方 法 は 変 更 さ れ ず そ の ま ま と な る 。

POSIX で は 、 kill(2)raise(3) で 生 成 で き な い シ グ ナ ル SIGFPE, SIGILL, SIGSEGV を 無 視 (ignore) し た 場 合 、 そ の 後 の 動 作 は 未 定 義 で あ る 。 ゼ ロ に よ る 整 数 割 り 算 の 結 果 は 未 定 義 と な る 。 ア ー キ テ ク チ ャ ー に よ っ て は 、 こ の と き SIGFPE シ グ ナ ル が 生 成 さ れ る 。 (同 様 に 負 の 最 大 整 数 を −1 で 割 る と SIGFPE が 生 成 さ れ る か も し れ な い ) こ の シ グ ナ ル を 無 視 す る と 無 限 ル ー プ に 陥 る か も し れ な い 。

POSIX.1−1990 で は SIGCHLDSIG_IGN を 設 定 す る こ と を 認 め て い な い 。 POSIX.1−2001 で は 認 め ら れ て お り 、 SIGCHLD を 無 視 す る こ と で ゾ ン ビ プ ロ セ ス の 生 成 を 防 止 す る こ と が で き る (wait(2) を 参 照 )。 さ ら に 、 BSD と System V で は SIGCHLD を 無 視 し た 際 の 動 作 が 異 な っ て い る 。 そ の た め 、 完 全 に 移 植 性 が あ る 方 法 で 、 終 了 し た 子 プ ロ セ ス が ゾ ン ビ に な ら な い こ と を 保 証 す る に は 、 SIGCHLD シ グ ナ ル を 補 足 し 、 wait(2) な ど を 実 行 す る し か な い 。

POSIX.1−1990 の 仕 様 で は SA_NOCLDSTOP の み が 定 義 さ れ て い る 。 POSIX.1−2001 で は SA_NOCLDWAIT, SA_RESETHAND, SA_NODEFER, SA_SIGINFO が 追 加 さ れ た 。 UNIX の 古 い 実 装 で 動 か す ア プ リ ケ ー シ ョ ン で 、 他 の sa_flags フ ラ グ を 使 用 す る と 移 植 性 が 下 が る 。

SA_RESETHAND フ ラ グ は SVr4 の 同 じ 名 前 の フ ラ グ と 互 換 性 が あ る 。

SA_NODEFER フ ラ グ は 1.3.9 以 降 の カ ー ネ ル で は 同 じ 名 前 の SVr4 の フ ラ グ と 互 換 性 が あ る 。 ぞ れ 以 前 の Linux カ ー ネ ル の 実 装 で は 、 こ の フ ラ グ を 設 定 し て い る シ グ ナ ル だ け で な く 、 ど の シ グ ナ ル で も 受 け る こ と を 許 し て い た (実 際 に は sa_mask の 設 定 に よ り 無 効 に で き る )。

sigaction() の 二 番 目 の 引 き 数 に NULL を 指 定 し て 呼 び 出 す と 、 現 在 の シ グ ナ ル ハ ン ド ラ ー を 確 認 す る こ と が で き る 。 ま た 、 二 番 目 と 三 番 目 の 引 き 数 を NULL に て 呼 び 出 す こ と で 、 指 定 さ れ た シ グ ナ ル が 現 在 の マ シ ン で 使 え る か ど う か チ ェ ッ ク で き る 。

SIGKILLSIGSTOP を (sa_mask に 指 定 し て ) 禁 止 す る こ と は で き な い 。 禁 止 し よ う と し て も 黙 っ て 無 視 さ れ る 。 シ グ ナ ル 集 合 の 操 作 に 関 す る 詳 細 は sigsetops(3) を 参 照 の こ と 。 シ グ ナ ル ハ ン ド ラ ー 内 か ら 安 全 に 呼 び 出 す こ と が で き る 、 async−signal−safe functions (非 同 期 シ グ ナ ル で 安 全 な 関 数 ) の リ ス ト に つ い て は signal(7) を 参 照 。 非 公 式
SA_SIGINFO
が 導 入 さ れ る 前 は 、 struct sigcontext 型 の 二 番 目 の 引 き 数 と 一 緒 に sa_handler を 使 用 す る こ と で 、 い く つ か の 追 加 の 情 報 を 入 手 す る こ と が で き た 。 詳 細 に つ い て は Linux カ ー ネ ル ソ ー ス の 関 連 部 分 を 見 て ほ し い 。 現 在 は こ の 使 用 法 は 廃 止 さ れ て い る 。

バ グ

2.6.13 以 前 の カ ー ネ ル で は 、 sa_flagsSA_NODEFER を 指 定 し た 場 合 、 ハ ン ド ラ ー が 実 行 中 に 配 送 さ れ た シ グ ナ ル 自 身 が マ ス ク さ れ な く な る だ け で な く 、 sa_mask に 指 定 さ れ た シ グ ナ ル も マ ス ク さ れ な く な る 。 こ の バ グ は 、 カ ー ネ ル 2.6.14 で 修 正 さ れ た 。

mprotect(2) 参 照 。

関 連 項 目

kill(1), kill(2), killpg(2), pause(2), restart_syscall(2), seccomp(2) sigaltstack(2), signal(2), signalfd(2), sigpending(2), sigreturn(2), sigprocmask(2), sigsuspend(2), wait(2), raise(3), siginterrupt(3), sigqueue(3), sigsetops(3), sigvec(3), core(5), signal(7)

こ の 文 書 に つ い て

こ の man ペ ー ジ は Linux man−pages プ ロ ジ ェ ク ト の リ リ ー ス 3.79 の 一 部 で あ る 。 プ ロ ジ ェ ク ト の 説 明 と バ グ 報 告 に 関 す る 情 報 は http://www.kernel.org/doc/man−pages/ に 書 か れ て い る 。