Manpages

名 前

signal − ANSI C シ グ ナ ル 操 作

書 式

#include <signal.h>

typedef void (*sighandler_t)(int);

sighandler_t signal(int signum, sighandler_t sighandler);

説 明

signal() の 動 作 は UNIX の バ ー ジ ョ ン に よ り 異 な る 。 ま た 、 歴 史 的 に 見 て Linux の バ ー ジ ョ ン に よ っ て も 異 な っ て い る 。 こ の シ ス テ ム コ ー ル の 使 用 は 避 け 、 代 わ り に sigaction(2) を 使 用 す る こ と 。 下 記 の 「 移 植 性 」 を 参 照 。

signal() は シ グ ナ ル signum の 処 理 方 法 を handler に 設 定 す る 。 handler に は 、 SIG_IGNSIG_DFL、 プ ロ グ ラ マ が 定 義 し た 関 数 (「 シ グ ナ ル ハ ン ド ラ ー 」 ) の ア ド レ ス の い ず れ か を 指 定 す る 。 シ グ ナ ル signum が プ ロ セ ス に 配 送 さ れ る と 、 以 下 の い ず れ か が 発 生 す る 。

* 処 理 方 法 が

SIG_IGN に 設 定 さ れ て い る 場 合 、 そ の シ グ ナ ル は 無 視 さ れ る 。

* 処 理 方 法 が

SIG_DFL に 設 定 さ れ て い る 場 合 、 シ グ ナ ル に 関 連 づ け ら れ た デ

フ ォ ル ト の 動 作 が 行 わ れ る (signal(7) 参 照 )。

* 処 理 方 法 と し て 関 数 が 設 定 さ れ て い る 場 合 、 ま ず 最 初 に 処 理 方 法 が

SIG_DFL に リ セ ッ ト さ れ る か そ の シ グ ナ ル の ブ ロ ッ ク が 実 行 さ れ た 後 、 signum を 引 き 数 と し て handler が 呼 び 出 さ れ る 。 ハ ン ド ラ ー が 起 動 さ れ る 際 に シ グ ナ ル が ブ ロ ッ ク さ れ た 場 合 、 ハ ン ド ラ ー が 返 る 際 に そ の シ グ ナ ル の ブ ロ ッ ク が 解 除 さ れ る 。 シ グ ナ ル SIGKILLSIGSTOP は 捕 捉 で き ず 、 無 視 す る こ と も で き な い 。

返 り 値

signal() は 、 今 ま で の シ グ ナ ル ハ ン ド ラ ー の 値 を 返 す 。 エ ラ ー の 場 合 は SIG_ERR を 返 し 、 errno に エ ラ ー の 原 因 を 示 す 値 を 設 定 す る 。

エ ラ ー

EINVAL

signum が 不 正 で あ る 。

準 拠

C89, C99, POSIX.1−2001.

注 意

マ ル チ ス レ ッ ド プ ロ セ ス に お け る signal() の 結 果 は 、 指 定 さ れ て い な い 。

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

SIGCHLD の 動 作 と し て SIG_IGN を 設 定 し た 場 合 の 詳 細 な 動 作 に つ い て は 、 sigaction(2) を 参 照 す る こ と 。 シ グ ナ ル ハ ン ド ラ ー 内 か ら 安 全 に 呼 び 出 す こ と が で き る 、 async−signal−safe functions (非 同 期 シ ン グ ル で 安 全 な 関 数 ) の リ ス ト に つ い て は signal(7) を 参 照 。

sighandler_t の 使 用 は GNU 拡 張 で あ り 、 _GNU_SOURCE が 定 義 さ れ た 場 合 に 公 開 さ れ る 。 glibc で は _BSD_SOURCE が 定 義 さ れ た 場 合 に は (BSD 由 来 の ) sig_t も 定 義 さ れ る 。 こ の よ う な 型 を 使 用 し な い と 、 signal() の 宣 言 は 読 み に く い も の と な る 。

void ( *signal(int signum, void (*handler)(int)) ) (int); 移 植 性 移 植 性 の あ る signal() の 使 い 方 は 、 シ グ ナ ル の 処 理 方 法 を SIG_DFLSIG_IGN に 設 定 す る 方 法 だ け で あ る 。 シ グ ナ ル ハ ン ド ラ ー を 設 定 す る の に signal() を 使 っ た と き の 動 作 は シ ス テ ム に よ り 異 な る (POSIX.1 は 明 示 的 に こ の 違 い を 認 め て い る )。 移 植 性 が 必 要 な と き は こ の シ ス テ ム コ ー ル を 使 用 し な い こ と 。

POSIX.1 は 、 sigaction(2) を 規 定 す る こ と で 移 植 性 に 関 す る 混 乱 を 解 決 し た 。 sigaction(2) は シ グ ナ ル ハ ン ド ラ ー が 起 動 さ れ る 際 の 挙 動 を 明 示 的 に 制 御 で き る 。 signal() の 代 わ り に こ の イ ン タ ー フ ェ イ ス を 使 う こ と 。 オ リ ジ ナ ル の UNIX シ ス テ ム で は 、 signal() を 使 っ て 設 定 さ れ た ハ ン ド ラ ー が シ グ ナ ル の 配 送 に よ り 起 動 さ れ る と 、 そ の シ グ ナ ル の 処 理 方 法 は SIG_DFL に リ セ ッ ト さ れ 、 シ ス テ ム は 同 じ シ グ ナ ル が さ ら に 生 成 さ れ て も シ グ ナ ル の 配 送 を ブ ロ ッ ク し な か っ た 。 こ れ は 、 以 下 の フ ラ グ で sigaction(2) を 呼 び 出 す の と 等 価 で あ る 。

sa.sa_flags = SA_RESETHAND | SA_NODEFER;

System V で も 、 signal() に 対 し て こ れ ら の 挙 動 を 規 定 し て い る 。 こ う し た 挙 動 は ま ず く 、 ハ ン ド ラ ー が ハ ン ド ラ ー 自 身 を 再 設 定 す る 機 会 が 来 る よ り 前 に 、 同 じ シ グ ナ ル が ま た 配 送 さ れ る 可 能 性 が あ る 。 さ ら に 、 同 じ シ グ ナ ル が 立 て 続 け に 配 送 さ れ る と 、 同 じ シ グ ナ ル が ハ ン ド ラ ー を 繰 り 返 し 起 動 さ れ る こ と に な る 。

BSD は こ の 状 況 が 改 善 し た が 、 残 念 な こ と に 、 そ の 過 程 で 既 存 の signal() の 挙 動 も 変 更 さ れ た 。 BSD で は 、 シ グ ナ ル ハ ン ド ラ ー が 起 動 さ れ た 際 、 シ グ ナ ル の 処 理 方 法 は リ セ ッ ト さ れ ず 、 ハ ン ド ラ ー の 実 行 中 は 、 同 じ シ グ ナ ル の さ ら な る 生 成 は 配 送 が ブ ロ ッ ク さ れ る 。 ま た 、 シ グ ナ ル ハ ン ド ラ ー が 中 断 さ れ た 場 合 、 停 止 中 の シ ス テ ム コ ー ル の い く つ か は 自 動 的 に 再 ス タ ー ト さ れ る 。 BSD の 挙 動 は 、 以 下 の フ ラ グ を 指 定 し た sigaction(2) の 呼 び 出 し と 等 価 で あ る 。

sa.sa_flags = SA_RESTART;

Linux で の 状 況 は 以 下 の 通 り で あ る 。

* カ ー ネ ル の

signal() シ ス テ ム コ ー ル は System V 方 式 を 提 供 し て い る 。

* デ フ ォ ル ト で

は 、 glibc 2 以 降 で は 、 signal() ラ ッ パ ー 関 数 は カ ー ネ ル の シ ス テ ム コ ー ル を 起 動 し な い 。 代 わ り に 、 ラ ッ パ ー 関 数 は BSD 方 式 を 示 す フ ラ グ を 使 っ て sigaction(2) を 呼 び 出 す 。 機 能 検 査 マ ク ロ _BSD_SOURCE を 定 義 し て い れ ば 、 こ の デ フ ォ ル ト の 動 作 と な る 。 デ フ ォ ル ト で は 、 _BSD_SOURCE が 定 義 さ れ る 。 _BSD_SOURCE_GNU_SOURCE が 定 義 さ れ た 場 合 に は 暗 黙 の う ち に 定 義 さ れ 、 も ち ろ ん 明 示 的 に 定 義 す る こ と も で き る 。
*

glibc 2 以 降 で は 、 機 能 検 査 マ ク ロ _BSD_SOURCE が 定 義 さ れ て い な け れ ば 、 signal() は System V 方 式 と な る 。 (gcc(1) が 標 準 指 定 モ ー ド (−std=xxx or −ansi) で 起 動 さ れ た 場 合 、 も し く は _POSIX_SOURCE, _XOPEN_SOURCE, _SVID_SOURCE と い っ た 他 の 様 々 な 機 能 検 査 マ ク ロ が 定 義 さ れ た 場 合 、 デ フ ォ ル ト の _BSD_SOURCE の 暗 黙 の 定 義 は 行 わ れ な い 。 feature_test_macros(7) を 参 照 の こ と 。 )

関 連 項 目

kill(1), alarm(2), kill(2), killpg(2), pause(2), sigaction(2), signalfd(2), sigpending(2), sigprocmask(2), sigsuspend(2), bsd_signal(3), raise(3), siginterrupt(3), sigqueue(3), sigsetops(3), sigvec(3), sysv_signal(3), signal(7)

こ の 文 書 に つ い て

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