signal | Programming Place Plus C言語編 標準ライブラリのリファレンス

C言語編 標準ライブラリのリファレンス signal

先頭へ戻る

signal関数

概要 シグナルを処理する方法を設定する。
ヘッダ signal.h
形式 void (*signal(int sig, void (*func)(int)))(int);
※整理すると、次のようになる。
typedef void (*func_t)(int);
func_t signal(int sig, func_t func);
引数 sig シグナル番号。
func シグナルハンドラ。
戻り値 成功した場合は、引数sig のシグナル番号に以前に設定されていたシグナルハンドラが返される。失敗した場合は、SIG_ERR を返す。
詳細 引数sig で指定したシグナルが発生したときの動作を設定する。失敗した場合は、errno に、不定な正の値が設定される。
引数sig に指定するシグナル番号は、標準で定義された以下の6個か、処理系が独自に定義した値のいずれかである。
意味
SIGABRT abort関数の呼び出しによって起こる異常終了。
SIGFPE ゼロ除算のような、誤った算術演算。
SIGILL コンピュータの不正命令によって起こるエラー。
SIGINT Ctrl+C の入力のような、ユーザーとの対話によって起こるシグナル。
SIGSEGV メモリの不正アクセス。
SIGTERM 別プログラムやユーザーからの終了シグナル。

引数func に SIG_DFL を指定した場合は、シグナル発生時にデフォルトの動作を取ることを意味する。SIG_IGN を指定した場合は、シグナルを無視することを意味する。これら以外の関数ポインタを指定した場合は、それが指す関数がシグナル発生時に呼び出される。この関数をシグナルハンドラと呼ぶ。シグナルハンドラに渡される引数は、発生したシグナルを表す番号である。
シグナルハンドラが呼び出される場合、その呼び出しに先立って、「signal(sig, SIG_DFL);」相当のことを行い、動作をデフォルトに戻すか、あるいは、シグナルハンドラから戻るまで同種のシグナルの発生をブロックするかのいずれを、処理系が選択する。ただし、そのシグナルが SIG_ILL の場合は何もしないことを選択してもよい。
シグナルハンドラの中でプログラムを終了させても良いし、戻っても良い。ただし、発生したシグナルが SIGFPE、SIGILL、SIGSEGV または、計算例外に対応する処理系定義のシグナルだった場合にシグナルハンドラから戻る場合の動作は未定義である。これら以外のシグナルのとき、シグナルハンドラから戻った場合は、シグナルが発生したところから再開する。
注意 abort関数raise関数以外の方法で発生したシグナルの場合、シグナルハンドラ内部での以下の行為は未定義の動作になる。
1.「volatile sig_atomic_t」以外の形で宣言された静的記憶域期間を持つオブジェクトを参照する行為。
2.abort関数、_Exit関数、シグナルハンドラの第1引数を指定した signal関数のいずれかを除いた、標準ライブラリ関数を呼び出す行為。
使用例
#include <signal.h>
#include <stdio.h>

volatile sig_atomic_t g_flag = 0;

void signal_handler(int signum) {
    g_flag = 1;
}

int main(void)
{
    signal(SIGINT, signal_handler);

    while( !g_flag ){
        puts( "wait" );
    }

    puts( "exit" );

    return 0;
}

実行結果:

wait
wait
wait
wait
  :
  :
(Ctrl + C を押下)
exit
関連 raise関数によってシグナルを発生させることができる。
解説章


参考リンク



更新履歴

'2018/4/24 「使用例」を変更。

'2018/4/14 全体的に文章を見直し修正。

'2018/1/22 新規作成。



標準ライブラリのリファレンス(名前順)のトップページへ

標準ライブラリのリファレンス(ヘッダ別)のトップページへ

C言語編のトップページへ

Programming Place Plus のトップページへ


はてなブックマーク Pocket に保存 Twitter でツイート Twitter をフォロー
Facebook でシェア Google+ で共有 LINE で送る rss1.0 取得ボタン RSS