Available in

(2) (3) (2)/cs (2)/de (2)/es (2)/fr (2)/ja (2)/ko (2)/nl (2)/pl

Contents

名 前

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 に は 、 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 要 素 に 関 す る 規 定 は な い 。

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

sa_flagsSA_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

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_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 シ グ ナ ル と SIGCHLDsi_pidsi_uid を 設 定 す る 。

*

POSIX.1b タ イ マ (Linux 2.6 以 降 ) は si_overrunsi_timerid を 設 定 す る 。 si_timerid フ ィ ー ル ド は カ ー ネ ル が タ イ マ を 特 定 す る の に 使 用 す る 内 部 ID で あ り 、 timer_create(2) が 返 す タ イ マ ID と 同 じ で は な い 。

*

SIGCHLDsi_status, si_utime, si_stime を 設 定 す る 。

*

si_intsi_ptr は POSIX.1b シ グ ナ ル の 送 信 者 に よ っ て 指 定 さ れ る 。 詳 細 は sigqueue(2) を 参 照 の こ と 。

*

SIGILL, SIGFPE, SIGSEGV, SIGBUSsi_addr に エ ラ ー が 発 生 し た ア ド レ ス を 設 定 す る 。 SIGPOLL は si_bandsi_fd を 設 定 す る 。

si_code は 、 そ の シ グ ナ ル が 送 信 さ れ た 理 由 を 示 す 値 で あ る (ビ ッ ト マ ス ク で は な い )。 以 下 の リ ス ト に 、 ど の シ グ ナ ル の 場 合 で も si_code に 入 り う る 値 を 、 シ グ ナ ル が 生 成 さ れ た 理 由 と と も に 記 載 す る 。

SI_USER

kill(2) ま た は raise(3)

SI_KERNEL

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

SI_QUEUE

sigqueue(2)

SI_TIMER

POSIX タ イ マ が 満 了 し た

SI_MESGQ

POSIX メ ッ セ ー ジ キ ュ ー の 状 態 が 変 化 し た (Linux 2.6.6 以 降 )。 mq_notify(3)参 照 。

SI_ASYNCIO

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

SI_SIGIO キ ュ ー イ

ン グ さ れ た SIGIO
SI_TKILL

tkill(2) ま た は tgkill(2) (Linux 2.4.19 以 降 )

SIGILL シ グ ナ ル の 場 合 、 si_code に は 以 下 の 値 を 指 定 で き る :

ILL_ILLOPC 不 正 な 命 令 コ ー ド

(opcode)

ILL_ILLOPN 不 正 な オ ペ ラ ン ド

ILL_ILLADR 不 正 な ア ド レ ッ シ ン

グ モ ー ド

ILL_ILLTRP 不 正 な ト ラ ッ プ

ILL_PRVOPC 特 権 が 必 要 な 命 令 コ ー ド

(opcode)

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 オ ブ ジ ェ ク ト 固 有 の ハ ー ド ウ ェ ア

エ ラ ー

SIGTRAP シ グ ナ ル の 場 合 、 si_code に は 以 下 の 値 を 指 定 で き る :

TRAP_BRKPT プ ロ セ ス の ブ レ ー ク ポ イ ン ト

TRAP_TRACE プ ロ セ ス の ト レ ー ス ・ ト ラ ッ プ

SIGCHLD シ グ ナ ル の 場 合 、 si_code に は 以 下 の 値 を 指 定 で き る :

CLD_EXITED 子 プ ロ セ ス が 終 了 し た

(exited)

CLD_KILLED 子 プ ロ セ ス が

kill さ れ た

CLD_DUMPED 子 プ ロ セ ス が 異 常 終 了 し た

CLD_TRAPPED ト レ ー ス 対 象 の 子 プ ロ セ ス が ト ラ ッ プ を 上 げ た

CLD_STOPPED 子 プ ロ セ ス が 停 止

(stop) し た

CLD_CONTINUED 停 止 し て い た 子 プ ロ セ ス が 再 開 し た

(Linux 2.6.9 以 降 )

SIGPOLL シ グ ナ ル の 場 合 、 si_code に は 以 下 の 値 を 指 定 で き る :

POLL_IN 入 力 デ ー タ が 利 用 可 能

POLL_OUT 出 力 バ ッ フ ァ が 利 用 可 能

POLL_MSG 入 力 メ ッ セ ー ジ が 利 用 可 能

POLL_ERR

I/O エ ラ ー

POLL_PRI 高 優 先 の 入 力 が 利 用 可 能

POLL_HUP デ バ イ ス が 接 続 さ れ て い な い

返 り 値

sigaction() は 成 功 す れ ば 0 を 返 し 、 エ ラ ー な ら ば −1 を 返 す 。

エ ラ ー

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 と SystemV で は 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 を 使 用 す る こ と で 、 い く つ か の 追 加 の 情 報 を 入 手 す る こ と が で き た 。 詳 細 に つ い て は カ ー ネ ル ソ ー ス の 関 連 部 分 を 見 て ほ し い 。 現 在 は こ の 使 用 法 は 廃 止 さ れ て い る 。

バ グ

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

mprotect(2) 参 照 。

関 連 項 目

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

COMMENTS

blog comments powered by Disqus