ホーム | ブログ | C++辞典 | サイトマップ | FAQ | 掲示板 | リンク集
メイン・メニュー
インデックス
プログラミング
その他
Top / <csignal>ヘッダ

<csignal>ヘッダ

 <csignal>ヘッダは、さまざまなシグナル?を操作するための関数の宣言と、マクロの定義を行う。処理系によっては、SIG_〜で始まる宣言不可能な関数へのポインタが追加されることがある。また、シグナル番号として、SIG〜で始まるマクロが追加されることがある。<csignal>ヘッダで定義される 6 つのシグナル番号は、raise 関数で明示的に生成される場合を除いて、処理系がこれらのシグナルを生成するとは限らない。

マクロ

SIG_DFL

シグナルの既定動作

解説
 signal 関数の第 2 実引数として指定することで、そのシグナルに対して処理系の既定の処理が行われるように設定する。

形式
  void (*SIG_DFL)(int);

SIG_IGN

シグナルの無視

形式
  void (*SIG_IGN)(int);

解説
 signal 関数の第 2 実引数として指定することで、そのシグナルを無視するように設定する。

SIG_ERR

シグナルの設定失敗

形式
  void (*SIG_ERR)(int);

解説
 signal 関数によるシグナルの設定に失敗した場合に、返却値として使用される。

SIGABRT

異常終了

解説
 異常終了時に生成されるシグナル番号であり、正の整数値に定義される。このシグナルは abort 関数から呼び出される。

SIGFPE

誤った算術演算

解説
 ゼロ除算やオーバーフローの結果として生成されるシグナル番号であり、正の整数値に定義される。

SIGILL

不正な関数イメージの検出

解説
 プロセッサの不正命令を実行しようとした場合などに生成されるシグナル番号であり、正の整数値に定義される。

SIGINT

対話的なアテンションシグナルの受け取り

解説
 割り込みなど、対話的なアテンションシグナルによって生成されるシグナル番号であり、正の整数値に定義される。例えば、Ctrl-C の入力によるプログラムの中断などによって生成されることが多い。

SIGSEGV

記憶域への不正なアクセス

解説
 書き込み禁止領域への書き込みや、アクセス権限のない領域へのアクセスなどによって生成されるシグナル番号であり、正の整数値に定義される。

SIGTERM

終了要求

解説
 プログラムへ送信された終了要求などによって生成されるシグナル番号であり、正の整数値に定義される。


sig_atomic_t

不可分なアクセスが可能な型

解説
 sig_atomic_t 型は、非同期割り込みが存在する場合でも、不可分にアクセスすることができる、volatile 修飾する可能な整数型である。


関数

raise

シグナルの送信

形式
namespace std {
  int raise(int sig);
}

引数
  sig:  シグナル番号

返却値
 raise 関数の呼び出しに成功した場合は 0 を、失敗した場合は 0 以外を返す。

解説
 シグナル番号 sig を実行中のプログラムに送信する。sig には、<csignal>ヘッダで定義される SIG〜から始まるマクロ (SIGABRTなど) を指定する。

signal

シグナルの設定

形式
namespace std {
  void (* signal(int sig, void (* func)(int)) )(int);
}

引数
  sig:  シグナル番号
  func:  シグナル処理ルーチン

返却値
 signal 関数の呼び出しに成功した場合、以前に signal 関数によって設定されていた func の値を返す。設定に失敗した場合は SIG_ERR を返す。

解説
 シグナル番号 sig が発生した場合に実行される処理を設定する。signal 関数が SIG_ERR を返した場合、errno の値は不定になる。非同期シグナル処理ルーチン?が生成したシグナルを受けた場合の動作は未定義である。

  • funcSIG_DFL であれば、そのシグナルに対する既定の処理が行われる。
  • funcSIG_IGN? であれば、そのシグナルは無視される。
  • シグナル処理ルーチン?、すなわち関数であれば、そのシグナルが発生したときにシグナル処理ルーチン?が呼び出される。
    • func が呼び出される前に、signal(sig, SIG_DFL) が実行される*1。ただし、sigSIGILL の場合は、signal(sig, SIG_DFL) が実行されるかどうかは処理系定義である。
    • (*func)(sig) が呼び出される。

 シグナル処理ルーチン? func から復帰した場合、sigSIGFPE であるか、処理系定義の計算処理例外であった場合*2動作は未定義である*3。その他の場合は、プログラムが中断されたところから再開される。

 abort 関数 または raise 関数 の結果としてシグナルが発生した場合、シグナル処理ルーチン?では、abort 関数exit 関数、または longjmp 関数 によって呼び出しを終了することができる。
 abort 関数 または raise 関数 の結果として発生したシグナル以外であり、かつ次のいずれかである場合の動作は未定義である。

 プログラムの開始時点で、いくつかのシグナル番号に対して signal(sig, SIG_IGN) が実行される場合がある。それ以外のシグナル番号に対しては signal(sig, SIG_DFL) が実行される。

 すべてのライブラリ関数は、signal 関数が呼び出すことがないかのように定義されている。


参照

<signal.h>ヘッダ


*1 C99 では、signal(sig, SIG_DFL) が呼び出されるか、シグナル処理ルーチン?が終了するまで、同種のシグナルの発生を遮るかは処理系定義
*2 C99 では、SIGILL または SIGSEGV の場合も同様
*3 規格上、SIGFPE 等の計算処理例外シグナルが発生した場合、シグナル処理ルーチン?から復帰する方法がない
*4 C99 では、abort 関数 または _Exit 関数も呼び出すことができる。また、signal 関数の呼び出しは、同種のシグナルに対して行わなければならない。

トップ   編集 差分 バックアップ 添付 複製 名前変更   一覧 単語検索   ヘルプ   最終更新のRSS
Counter: 7391, today: 2, yesterday: 0
Last-modified: Wed, 07 Dec 2005 16:47:29 JST (4725d)
 ホーム | プロフィール | メール | ログイン | 管理
Copyright © 2005-2009 by TAKAGI Nobuhisa