名 前
signal − シ グ ナ ル の 概 要
説 明
Linux は POSIX 信 頼 シ グ ナ ル (reliable signal; 以 後 "標 準 シ グ ナ ル "と 表 記 ) と POSIX リ ア ル タ イ ム シ グ ナ ル の 両 方 に 対 応 し て い る 。 シ グ ナ ル 処 理 方 法 シ グ ナ ル は そ れ ぞ れ 現 在 の 「 処 理 方 法 (disposition)」 を 保 持 し て お り 、 こ の 処 理 方 法 に よ り シ グ ナ ル が 配 送 さ れ た 際 に プ ロ セ ス が ど の よ う な 振 舞 い を す る か が 決 ま る 。 後 述 の 表 の "動 作 " の 欄 の エ ン ト リ ー は 各 シ グ ナ ル の デ フ ォ ル ト の 処 理 方 法 を 示 し て お り 、 以 下 の よ う な 意 味 を 持 つ 。
Term デ フ ォ ル ト の 動 作 は プ ロ セ ス 終 了 。 |
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Ign デ フ ォ ル ト の 動 作 は こ の シ グ ナ ル の 無 視 。 |
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Core デ フ ォ ル ト の 動 作 は プ ロ セ ス 終 了 と コ ア ダ ン プ 出 力 |
(core(5) 参 照 )。 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Stop デ フ ォ ル ト の 動 作 は プ ロ セ ス の 一 時 停 止 。 実 行 の 再 開 。 プ ロ セ ス は 、 sigaction(2) や signal(2) を 使 っ て 、 シ グ ナ ル の 処 理 方 法 を 変 更 す る こ と が で き る (signal(2) の 方 が シ グ ナ ル ハ ン ド ラ ー を 設 定 す る 際 の 移 植 性 が 低 い ; 詳 細 は signal(2) を 参 照 )。 シ グ ナ ル の 配 送 時 に 起 こ る 動 作 と し て プ ロ セ ス が 選 択 で き る の は 、 次 の い ず れ か 一 つ で あ る 。 デ フ ォ ル ト の 動 作 を 実 行 す る 、 シ グ ナ ル を 無 視 す る 、 シ グ ナ ル ハ ン ド ラ ー (signal handler) で シ グ ナ ル を 捕 捉 す る 。 シ グ ナ ル ハ ン ド ラ ー と は 、 シ グ ナ ル 配 送 時 に 自 動 的 に 起 動 さ れ る プ ロ グ ラ マ 定 義 の 関 数 で あ る 。 (デ フ ォ ル ト で は 、 シ グ ナ ル ハ ン ド ラ ー は 通 常 の プ ロ セ ス の ス タ ッ ク 上 で 起 動 さ れ る 。 シ グ ナ ル ハ ン ド ラ ー が 代 替 ス タ ッ ク (alternate stack) を 使 用 す る よ う に 設 定 す る こ と も で き る 。 代 替 ス タ ッ ク を 使 用 す る よ う に 設 定 す る 方 法 と 、 ど の よ う な 際 に 代 替 ス タ ッ ク が 役 に 立 つ か に つ い て の 議 論 に つ い て は sigaltstack(2) を 参 照 の こ と 。 シ グ ナ ル の 処 理 方 法 は プ ロ セ ス 単 位 の 属 性 で あ る 。 マ ル チ ス レ ッ ド の ア プ リ ケ ー シ ョ ン で は 、 あ る シ グ ナ ル の 処 理 方 法 は 全 て の ス レ ッ ド で 同 じ で あ る 。 fork(2) 経 由 で 作 成 さ れ た 子 プ ロ セ ス は 、 親 プ ロ セ ス の シ グ ナ ル の 処 理 方 法 の コ ピ ー を 継 承 す る 。 execve(2) の 前 後 で 、 ハ ン ド ラ ー が 設 定 さ れ て い る シ グ ナ ル の 処 理 方 法 は デ フ ォ ル ト に リ セ ッ ト さ れ 、 無 視 が 設 定 さ れ て い る シ グ ナ ル の 処 理 方 法 は 変 更 さ れ ず そ の ま ま と な る 。 シ グ ナ ル の 送 信 以 下 の シ ス テ ム コ ー ル と ラ イ ブ ラ リ 関 数 を 使 っ て 、 呼 び 出 し 者 は シ グ ナ ル を 送 信 す る こ と が で き る 。
POSIX ス レ ッ ド に シ グ ナ ル を 送 る 。
(こ の シ ス テ ム コ ー ル を 使 っ て pthread_kill(3) は 実 装 さ れ て い る )。
(suspend) す る こ と が で き る (ハ ン ド ラ ー が 設 定 さ れ て い な い シ グ ナ ル に よ り そ の プ ロ セ ス が 終 了 し た 場 合 に も 実 行 の 停 止 は 終 了 す る )。
(下 記 参 照 ) を 変 更 し 、 マ ス ク さ れ て い な い シ グ ナ ル の い ず れ か が 捕 捉 さ れ る ま で 実 行 を 中 断 す る 。 シ グ ナ ル の 同 期 受 信 シ グ ナ ル ハ ン ド ラ ー 経 由 で シ グ ナ ル を 非 同 期 (asynchronously) で 捕 捉 す る 以 外 に も 、 シ グ ナ ル を 同 期 (synchronously) し て 受 け 付 け る こ と も で き る 。 同 期 し て 受 け 付 け る と は 、 シ グ ナ ル が 配 送 さ れ る ま で 実 行 を 停 止 (block) す る と い う こ と で あ る 。 シ グ ナ ル を 受 け 付 け た 際 に 、 カ ー ネ ル は そ の シ グ ナ ル に 関 す る 情 報 を 呼 び 出 し 者 に 返 す 。 こ れ を 行 う 一 般 的 な 方 法 が 二 つ あ る 。
シ グ ナ ル マ ス ク と 処 理 待 ち シ グ ナ ル シ グ ナ ル は ブ ロ ッ ク (block) さ れ る こ と が あ る 。 ブ ロ ッ ク さ れ る と 、 そ の シ グ ナ ル は そ の 後 ブ ロ ッ ク を 解 除 さ れ る ま で 配 送 さ れ な く な る 。 シ グ ナ ル が 生 成 さ れ て か ら 配 送 さ れ る ま で の 間 、 そ の シ グ ナ ル は 処 理 待 ち (pending) で あ る と 呼 ば れ る 。 プ ロ セ ス 内 の 各 ス レ ッ ド は 、 そ れ ぞ れ 独 立 な シ グ ナ ル マ ス ク (signal mask) を 持 つ 。 シ グ ナ ル マ ス ク は そ の ス レ ッ ド が 現 在 ブ ロ ッ ク し て い る シ グ ナ ル 集 合 を 示 す も の で あ る 。 ス レ ッ ド は 、 pthread_sigmask(3) を 使 っ て 自 分 の シ グ ナ ル マ ス ク を 操 作 で き る 。 伝 統 的 な シ ン グ ル ス レ ッ ド の ア プ リ ケ ー シ ョ ン で は 、 sigprocmask(2) を 使 っ て 、 シ グ ナ ル マ ス ク を 操 作 で き る 。 fork(2) 経 由 で 作 成 さ れ た 子 プ ロ セ ス は 親 プ ロ セ ス の シ グ ナ ル マ ス ク の コ ピ ー を 継 承 す る 。 execve(2) の 前 後 で シ グ ナ ル マ ス ク は 保 持 さ れ る 。 生 成 さ れ る シ グ ナ ル (し た が っ て 処 理 待 ち と な る シ グ ナ ル ) に は 、 プ ロ セ ス 全 体 宛 て と 特 定 の ス レ ッ ド 宛 て が あ る 。 例 え ば 、 プ ロ セ ス 全 体 宛 て の シ グ ナ ル は kill(2) を 使 っ て 送 信 さ れ る 。 特 定 の マ シ ン 語 の 命 令 の 実 行 の 結 果 と し て 生 成 さ れ る 、 SIGSEGV や SIGFPE な ど の シ グ ナ ル は 、 ス レ ッ ド 宛 て と な る 。 ま た 、 pthread_kill(3) を 使 っ て 特 定 の ス レ ッ ド 宛 て に 生 成 さ れ た シ グ ナ ル も ス レ ッ ド 宛 て と な る 。 プ ロ セ ス 宛 て の シ グ ナ ル は 、 そ の シ グ ナ ル を ブ ロ ッ ク し て い な い ス レ ッ ド の う ち い ず れ か の 一 つ に 配 送 す る こ と が で き る 。 そ の シ グ ナ ル を ブ ロ ッ ク し て い な い ス レ ッ ド が 複 数 あ る 場 合 、 シ グ ナ ル を 配 送 す る ス レ ッ ド は カ ー ネ ル が 無 作 為 に 選 択 す る 。 ス レ ッ ド は 、 sigpending(2) を 使 っ て 、 現 在 処 理 待 ち の シ グ ナ ル 集 合 を 取 得 す る こ と が で き る 。 こ の 集 合 は 、 プ ロ セ ス 宛 て の 処 理 待 ち シ グ ナ ル と 呼 び 出 し た ス レ ッ ド 宛 て の シ グ ナ ル の 両 方 か ら 構 成 さ れ る 。 fork(2)
経 由 で 作 成 さ
れ た 子 プ ロ セ
ス で は 、 処 理
待 ち の シ グ ナ
ル 集 合 は 空 の
集 合 で 初 期 化
さ れ る 。 execve(2)
の 前 後 で 、 処
理 待 ち の シ グ
ナ ル 集 合 は 保
持 さ れ る 。 標
準 シ グ ナ ル シ グ ナ ル SIGKILL と SIGSTOP は キ ャ ッ チ 、 ブ ロ ッ ク 、 無 視 で き な い 。 次 に 、 POSIX.1−1990 標 準 に は な い が 、 SUSv2 と POSIX.1−2001 に 記 述 さ れ て い る シ グ ナ ル を 示 す 。 Linux 2.2 以 前 で は 、 SIGSYS, SIGXCPU, SIGXFSZ お よ び SPARC と MIPS 以 外 の ア ー キ テ ク チ ャ ー で の SIGBUS の デ フ ォ ル ト の 振 る 舞 い は (コ ア ダ ン プ 出 力 な し の ) プ ロ セ ス 終 了 で あ っ た 。 (他 の UNIX シ ス テ ム に も SIGXCPU と SIGXFSZ の デ フ ォ ル ト の 動 作 が コ ア ダ ン プ な し の プ ロ セ ス 終 了 の も の が あ る 。 ) Linux 2.4 で は 、 POSIX.1−2001 で の 要 求 仕 様 に 準 拠 し て 、 こ れ ら の シ グ ナ ル で 、 プ ロ セ ス を 終 了 さ せ 、 コ ア ダ ン プ を 出 力 す る よ う に な っ て い る 。 次 に そ の 他 の 各 種 シ グ ナ ル を 示 す 。 (シ グ ナ ル 29 は alpha で は SIGINFO / SIGPWR だ が 、 sparc で は SIGLOST で あ る 。 ) SIGEMT は POSIX.1−2001 に 規 定 さ れ て い な い が 、 そ の 他 の 多 く の UNIX シ ス テ ム に 存 在 す る 。 デ フ ォ ル ト の 動 作 は 多 く の 場 合 、 コ ア ダ ン プ 出 力 を 伴 う プ ロ セ ス の 終 了 で あ る 。 SIGPWR は (POSIX.1−2001 に 規 定 さ れ て い な い が ) こ の シ グ ナ ル が 存 在 す る 他 の UNIX シ ス テ ム で は 多 く の 場 合 、 デ フ ォ ル ト 動 作 は 無 視 で あ る 。 SIGIO は (POSIX.1−2001 に 規 定 さ れ て い な い が ) い く つ か の 他 の UNIX シ ス テ ム で は デ フ ォ ル ト 動 作 は 無 視 で あ る 。 SIGUNUSED
が 定 義 さ れ て
い る 場 合 に は
、 ほ と ん ど の
ア ー キ テ ク チ
ャ ー で SIGSYS の 同
義 語 と な っ て
い る 。 リ ア ル
タ イ ム シ グ ナ
ル Linux は 、 32 個 の 異 な る リ ア ル タ イ ム シ グ ナ ル に 対 応 し て お り 、 そ の 番 号 は 33 か ら 64 で あ る 。 し か し な が ら 、 glibc の POSIX ス レ ッ ド 実 装 は 、 内 部 で 2個 (NPTL の 場 合 ) か 3個 (LinuxThreads の 場 合 ) の リ ア ル タ イ ム シ グ ナ ル を 使 用 し て お り (pthreads(7) 参 照 )、 SIGRTMIN の 値 を 適 切 に (34 か 35 に ) 調 整 す る 。 利 用 可 能 な リ ア ル タ イ ム シ グ ナ ル の 範 囲 は glibc の ス レ ッ ド 実 装 に よ り 異 な る し (使 用 す る カ ー ネ ル と glibc に よ り 実 行 時 に も 変 化 す る )、 UNIX シ ス テ ム の 種 類 に よ っ て も 異 な る 。 し た が っ て 、 プ ロ グ ラ ム で は 「 ハ ー ド コ ー デ ィ ン グ し た 数 字 を 使 っ て の リ ア ル タ イ ム シ グ ナ ル の 参 照 は 決 し て す べ き で は な く 」 、 代 わ り に SIGRTMIN+n の 形 で 参 照 す べ き で あ る 。 ま た 、 SIGRTMIN+n が SIGRTMAX を 超 え て い な い か の チ ェ ッ ク を (実 行 時 に ) 適 切 に 行 う べ き で あ る 。 標 準 シ グ ナ ル と 異 な り 、 リ ア ル タ イ ム シ グ ナ ル に は 事 前 に 定 義 さ れ た 意 味 は な い 。 リ ア ル タ イ ム シ グ ナ ル の 全 部 を ア プ リ ケ ー シ ョ ン で 定 義 し た 用 途 に 使 え る 。 ハ ン ド リ ン グ し な い リ ア ル タ イ ム シ グ ナ ル の デ フ ォ ル ト の 動 作 は 受 信 し た プ ロ セ ス の 終 了 で あ る 。 リ ア ル タ イ ム シ グ ナ ル は 以 下 の 特 徴 が あ る :
1 つ だ け が キ ュ ー に 入 れ ら れ る 。
ポ イ ン タ ー ) を シ グ ナ ル と 共 に 送 信 で き る 。 受 信 側 プ ロ セ ス が sigaction(2) に SA_SIGINFO フ ラ グ を 指 定 し て シ グ ナ ル ハ ン ド ラ ー を 設 定 し た 場 合 、 こ の デ ー タ は siginfo_t 構 造 体 の si_value フ ィ ー ル ド 経 由 で ハ ン ド ラ ー の 第 2 引 き 数 と し て 渡 さ れ 、 利 用 す る こ と が で き る 。 さ ら に 、 こ の 構 造 体 の si_pid と si_uid フ ィ ー ル ド で シ グ ナ ル を 送 信 し た プ ロ セ ス の PID と 実 ユ ー ザ ー ID を 得 る こ と が で き る 。
(つ ま り 小 さ い 番 号 の シ グ ナ ル が 高 い 優 先 順 位 を 持 つ 。 ) 対 照 的 に 、 一 つ の プ ロ セ ス に 対 し て 複 数 の 標 準 シ グ ナ ル が 処 理 待 ち と な っ た 場 合 、 こ れ ら の シ グ ナ ル が 配 送 さ れ る 順 序 は 不 定 で あ る 。 一 つ の プ ロ セ ス に 対 し て 標 準 シ グ ナ ル と リ ア ル タ イ ム シ グ ナ ル の 両 方 が 処 理 待 ち の 場 合 、 POSIX は ど ち ら が 先 に 配 送 さ れ る か を 規 定 し て い な い 。 Linux で は 、 他 の 多 く の 実 装 と 同 様 、 こ の よ う な 場 合 に は 標 準 シ グ ナ ル が 優 先 さ れ る 。 POSIX に よ れ ば 、 1 プ ロ セ ス 毎 に 最 低 _POSIX_SIGQUEUE_MAX (32) 個 の リ ア ル タ イ ム シ グ ナ ル を キ ュ ー に 入 れ ら れ る べ き と し て い る 。 し か し 、 Linux で は 違 っ た 実 装 に な っ て い る 。 カ ー ネ ル 2.6.7 ま で は (2.6.7 を 含 む )、 全 プ ロ セ ス で キ ュ ー に 入 っ て い る リ ア ル タ イ ム シ グ ナ ル の 数 の 合 計 に つ い て シ ス テ ム 全 体 で の 制 限 が あ る 。 こ の 制 限 は /proc/sys/kernel/rtsig−max フ ァ イ ル で 見 る こ と が で き 、 (権 限 が あ れ ば ) 変 更 も で き る 。 関 係 す る フ ァ イ ル と し て 、 /proc/sys/kernel/rtsig−nr を 見 る こ と で 、 い く つ の リ ア ル タ イ ム シ グ ナ ル が 現 在 キ ュ ー に 入 っ て い る か を 知 る こ と が で き る 。 Linux 2.6.8 で 、 こ れ ら の /proc 経 由 の イ ン タ ー フ ェ ー ス は 、 RLIMIT_SIGPENDING リ ソ ー ス 制 限 に 置 き 換 え ら れ た 。 こ れ は 、 キ ュ ー に 入 る シ グ ナ ル 数 に 関 し て ユ ー ザ ー 単 位 に 上 限 を 指 定 す る も の で あ る 。 詳 し く は setrlimit(2) を 参 照 。 非 同 期 シ グ ナ ル で 安 全 な 関 数 (async−signal−safe functions) シ グ ナ ル ハ ン ド ラ ー 関 数 に は 非 常 に 注 意 し な け れ ば な ら な い 。 他 の 場 所 の 処 理 は プ ロ グ ラ ム 実 行 の 任 意 の 箇 所 で 中 断 さ れ る 可 能 性 が あ る た め で あ る 。 POSIX に は 「 安 全 な 関 数 (safe function)」 と い う 概 念 が あ る 。 シ グ ナ ル が 安 全 で な い 関 数 の 実 行 を 中 断 し 、 か つ handler が 安 全 で な い 関 数 を 呼 び 出 し た 場 合 、 プ ロ グ ラ ム の 挙 動 は 未 定 義 で あ る 。 POSIX.1−2004 (POSIX.1−2001 Technical Corrigendum (正 誤 表 ) 2 と も 言 う ) で は 、 シ グ ナ ル ハ ン ド ラ ー 内 で の 安 全 な 呼 び 出 し を 保 証 す る こ と が 必 須 の 関 数 と し て 以 下 が 規 定 さ れ て い る 。 _Exit() POSIX.1−2008 で は 、 上 記 の リ ス ト の う ち fpathconf(), pathconf(), sysconf() が 削 除 さ れ 、 以 下 の 関 数 が 追 加 さ れ た 。 execl()
EINTR で 失 敗 す る 。 こ れ ら の 二 つ の 挙 動 の う ち ど ち ら が 起 こ る か は 、 イ ン タ ー フ ェ イ ス に よ り 依 存 し 、 シ グ ナ ル ハ ン ド ラ ー が SA_RESTART フ ラ グ (sigaction(2) 参 照 ) を 使 っ て 設 定 さ れ て い た か に も 依 存 す る 。 詳 細 は UNIX シ ス テ ム に よ っ て 異 な る 。 Linux に お け る 詳 細 を 以 下 で 説 明 す る 。 以 下 の イ ン タ ー フ ェ イ ス の い ず れ か の 呼 び 出 し が 停 止 し て い る 間 に シ グ ナ ル ハ ン ド ラ ー に よ り 割 り 込 ま れ た 場 合 、 SA_RESTART フ ラ グ が 使 用 さ れ て い れ ば 、 シ グ ナ ル ハ ン ド ラ ー が 返 っ た 後 に そ の 呼 び 出 し は 自 動 的 に 再 ス タ ー ト さ れ る こ と に な る 。 そ れ 以 外 の 場 合 は 、 そ の 呼 び 出 し は エ ラ ー EINTR で 失 敗 す る こ と に な る 。
|