Man page - sigaction(2)

Packages contains this manual

Available languages:

en fr pl nl ja ru de

Manual

SIGACTION

名 前
書 式
説 明
The siginfo_t argument to a SA_SIGINFO handler
The si_code field
返 り 値
エ ラ ー
準 拠
注 意
C ラ イ ブ ラ リ と カ ー ネ ル の 違 い
非 公 式
バ グ

関 連 項 目
こ の 文 書 に つ い て

名 前

sigaction, rt_sigaction - シ グ ナ ル の 動 作 の 確 認 と 変 更

書 式

#include <signal.h>

int sigaction(int signum , const struct sigaction * act ,
struct sigaction *
oldact );

glibc 向 け の 機 能 検 査 マ ク ロ の 要 件 ( feature_test_macros (7) 参 照 ):

sigaction (): _POSIX_C_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 specifies the action to be associated with signum and is be one of the following:

*

SIG_DFL for the default action.

*

SIG_IGN to ignore this signal.

*

A pointer to a signal handling function. This function receives the signal number as its only argument.

If SA_SIGINFO is specified in sa_flags , then sa_sigaction (instead of sa_handler ) specifies the signal-handling function for signum . This function receives three arguments, as described below.

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

Do not add the signal to the thread’s signal mask while the handler is executing, unless the signal is specified in act.sa_mask . Consequently, a further instance of the signal may be delivered to the thread while it is executing the handler. This flag is meaningful only when establishing a signal handler.

SA_NOMASK is an obsolete, nonstandard synonym for this flag.

SA_ONSTACK

sigaltstack (2) で 提 供 さ れ る 別 の シ グ ナ ル ス タ ッ ク で シ グ ナ ル ハ ン ド ラ ー を 呼 び 出 す 。 別 の シ グ ナ ル ス タ ッ ク が 利 用 可 能 で な け れ ば 、 デ フ ォ ル ト の ス タ ッ ク が 使 用 さ れ る 。 こ の フ ラ グ は シ グ ナ ル ハ ン ド ラ ー を 設 定 す る 際 に の み 意 味 を 持 つ 。

SA_RESETHAND

Restore the signal action to the default upon entry to the signal handler. This flag is meaningful only when establishing a signal handler.

SA_ONESHOT is an obsolete, nonstandard synonym for this flag.

SA_RESTART

い く つ か の シ ス テ ム コ ー ル を シ グ ナ ル の 通 知 の 前 後 で 再 開 で き る よ う に し て 、 BSD シ グ ナ ル 方 式 (semantics) と 互 換 性 の あ る 動 作 を 提 供 す る 。 こ の フ ラ グ は シ グ ナ ル ハ ン ド ラ ー を 設 定 す る 際 に の み 意 味 を 持 つ 。 signal (7) に 書 か れ て い る シ ス テ ム コ ー ル の 再 開 に 関 す る 議 論 を 参 照 の こ と 。

SA_RESTORER

ア プ リ ケ ー シ ョ ン で の 使 用 を 意 図 し た も の で は な い 。 こ の フ ラ グ は C ラ イ ブ ラ リ が sa_restorer フ ィ ー ル ド に "signal trampoline" の ア ド レ ス が 入 っ て い る こ と を 示 す た め に 使 用 さ れ る 。 詳 細 は sigreturn (2) を 参 照 。

SA_SIGINFO (Linux 2.2 以 降 )

シ グ ナ ル ハ ン ド ラ ー は 一 つ で は な く 、 三 つ の 引 数 を 持 つ 。 こ の 場 合 は sa_handler の か わ り に sa_sigaction を 設 定 し な け れ ば な ら な い こ の フ ラ グ は シ グ ナ ル ハ ン ド ラ ー を 設 定 す る 際 に の み 意 味 を 持 つ 。

The siginfo_t argument to a SA_SIGINFO handler

When the SA_SIGINFO flag is specified in act.sa_flags , the signal handler address is passed via the act.sa_sigaction field. This handler takes three arguments, as follows:

void
handler(int sig, siginfo_t *info, void *ucontext)
{
...
}

These three arguments are as follows

sig

The number of the signal that caused invocation of the handler.

info

A pointer to a siginfo_t , which is a structure containing further information about the signal, as described below.

ucontext

This is a pointer to a ucontext_t structure, cast to void * . The structure pointed to by this field contains signal context information that was saved on the user-space stack by the kernel; for details, see sigreturn (2). Further information about the ucontext_t structure can be found in getcontext (3) and signal (7). Commonly, the handler function doesn’t make any use of the third argument.

The siginfo_t data type is a structure with the following fields:

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 */
union sigval 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_lower; /* Lower bound when address violation
occurred (since Linux 3.19) */
void *si_upper; /* Upper bound when address violation
occurred (since Linux 3.19) */
int si_pkey; /* Protection key on PTE that caused
fault (since Linux 4.6) */
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 固 有 の 拡 張 で あ る 。

The SEGV_BNDERR suberror of SIGSEGV populates si_lower and si_upper .

The SEGV_PKUERR suberror of SIGSEGV populates si_pkey .

*

SIGIO / SIGPOLL (2 つ の 名 前 は Linux で は 同 義 語 ) で は si_band si_fd が 設 定 さ れ る 。 si_band イ ベ ン ト は 、 poll (2) が revents フ ィ ー ル ド に 設 定 す る の と 同 じ 値 が 入 っ た ビ ッ ト マ ス ク で あ る 。 si_fd フ ィ ー ル ド は I/O イ ベ ン ト が 発 生 し た フ ァ イ ル デ ィ ス ク リ プ タ ー を 示 す 。 詳 細 に つ い て は fcntl (2) の F_SETSIG の 説 明 を 参 照 の こ と 。

*

seccomp フ ィ ル タ ー が SECCOMP_RET_TRAP を 返 す 際 に (Linux 3.5 以 降 で ) 生 成 さ れ る SIGSYS シ グ ナ ル で は 、 si_call_addr , si_syscall , si_arch , si_arch seccomp (2) で 説 明 さ れ て い る 他 の フ ィ ー ル ド が 設 定 さ れ る 。

The si_code field

The si_code field inside the siginfo_t argument that is passed to a SA_SIGINFO signal handler is a value (not a bit mask) indicating why this signal was sent. For a ptrace (2) event, si_code will contain SIGTRAP and have the ptrace event in the high byte:

(SIGTRAP | PTRACE_EVENT_foo << 8).

For a non- ptrace (2) event, the values that can appear in si_code are described in the remainder of this section. Since glibc 2.20, the definitions of most of these symbols are obtained from <signal.h> by defining feature test macros (before including any header file) as follows:

*

_XOPEN_SOURCE with the value 500 or greater;

*

_XOPEN_SOURCE and _XOPEN_SOURCE_EXTENDED ; or

*

_POSIX_C_SOURCE with the value 200809L or greater.

For the TRAP_* constants, the symbol definitions are provided only in the first two cases. Before glibc 2.20, no feature test macros were required to obtain these symbols.

通 常 の シ グ ナ ル の 場 合 に は 、 以 下 の リ ス ト に 示 す 値 が ど の シ グ ナ ル の 場 合 で も 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 / SIGPOLL si_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

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

SEGV_BNDERR (Linux 3.19 以 降 )

Failed address bound checks.

SEGV_PKUERR (Linux 4.6 以 降 )

Access was denied by memory protection keys. See pkeys (7). The protection key which applied to this access is available via si_pkey .

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 以 降 , IA64 の み )

プ ロ セ ス の ブ ラ ン チ ト ラ ッ プ

TRAP_HWBKPT (Linux 2.4 以 降 , IA64 の み )

ハ ー ド ウ ェ ア の ブ レ ー ク ポ イ ン ト /ウ ォ ッ チ ポ イ ン ト

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

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

EINVAL

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

準 拠

POSIX.1-2001, POSIX.1-2008, SVr4.

注 意

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

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

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

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

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

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

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

SIGKILL SIGSTOP を ( sa_mask に 指 定 し て ) 禁 止 す る こ と は で き な い 。 禁 止 し よ う と し て も 黙 っ て 無 視 さ れ る 。

シ グ ナ ル 集 合 の 操 作 に 関 す る 詳 細 は sigsetops (3) を 参 照 の こ と 。

シ グ ナ ル ハ ン ド ラ ー 内 か ら 安 全 に 呼 び 出 す こ と が で き る 、 async-signal-safe functions (非 同 期 シ グ ナ ル で 安 全 な 関 数 ) の リ ス ト に つ い て は signal-safety (7) を 参 照 。

C ラ イ ブ ラ リ と カ ー ネ ル の 違 い

The glibc wrapper function for sigaction () gives an error ( EINVAL ) on attempts to change the disposition of the two real-time signals used internally by the NPTL threading implementation. See nptl (7) for details.

On architectures where the signal trampoline resides in the C library, the glibc wrapper function for sigaction () places the address of the trampoline code in the act.sa_restorer field and sets the SA_RESTORER flag in the act.sa_flags field. See sigreturn (2).

The original Linux system call was named sigaction (). However, with the addition of real-time signals in Linux 2.2, the fixed-size, 32-bit sigset_t type supported by that system call was no longer fit for purpose. Consequently, a new system call, rt_sigaction (), was added to support an enlarged sigset_t type. The new system call takes a fourth argument, size_t sigsetsize , which specifies the size in bytes of the signal sets in act.sa_mask and oldact.sa_mask . This argument is currently required to have the value sizeof(sigset_t) (or the error EINVAL results). The glibc sigaction () wrapper function hides these details from us, transparently calling rt_sigaction () when the kernel provides it.

非 公 式

Before the introduction of SA_SIGINFO , it was also possible to get some additional information about the signal. This was done by providing an sa_handler signal handler with a second argument of type struct sigcontext , which is the same structure as the one that is passed in the uc_mcontext field of the ucontext structure that is passed (via a pointer) in the third argument of the sa_sigaction handler. See the relevant Linux kernel sources for details. This use is obsolete now.

バ グ

When delivering a signal with a SA_SIGINFO handler, the kernel does not always provide meaningful values for all of the fields of the siginfo_t that are relevant for that signal.

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

mprotect (2) 参 照 。

関 連 項 目

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

こ の 文 書 に つ い て

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