Cライブラリ関数 -signal()

C 标准库 - <signal.h>C標準ライブラリ - <signal.h>

説明

Cライブラリ関数void (*signal(int sig, void (*func)(int)))(int)シグナルを処理する関数を設定します。つまり、sigパラメータを持つシグナルハンドラ。

signalこの関数はC標準ライブラリ内の関数で、シグナルハンドラを設定するために使用されます。この関数は<signal.h>ヘッダファイル内で定義されています。signalこの関数を使用すると、プログラムは特定のシグナル(たとえばSIGINTCtrl+C を押すことで生成される)が届いたときに実行するハンドラを定義できます。

宣言

以下は signal() 関数の宣言です。

void (*signal(int sig, void (*func)(int)))(int);

パラメータ

  • sig-- シグナルハンドラ内で変数として使用されるシグナルコード。以下は重要な標準シグナル定数です。
宏シグナル
SIGABRT(Signal Abort) プログラムの異常終了。
SIGFPE(Signal Floating-Point Exception) 算術演算エラー。0による除算やオーバーフローなど(必ずしも浮動小数点演算とは限りません)。
SIGILL(Signal Illegal Instruction) 不正な関数イメージ(不正命令など)。通常はコード内の変種やデータの実行試行が原因です。
SIGINT(Signal Interrupt) 割り込みシグナル。ctrl-C など。通常はユーザーによって生成されます。
SIGSEGV(Signal Segmentation Violation) メモリへの不正アクセス。存在しないメモリ位置へのアクセスなど。
SIGTERM(Signal Terminate) このプログラムに送信される終了要求シグナル。
  • func-- 関数へのポインタ。プログラム定義の関数か、以下の定義済み関数のいずれかです。
SIG_DFLデフォルトのシグナルハンドラ。
SIG_IGNシグナルを無視。

戻り値

この関数は、以前のシグナルハンドラの値を返します。エラーが発生した場合は SIG_ERR を返します。

例

以下の例は、signal() 関数の使い方を示しています。

例

#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <signal.h>

void sighandler(int);

int main()
{
   signal(SIGINT, sighandler);

   while(1)
   {
      printf("1秒間スリープを開始...\n"\n");
      sleep(1);
   }

   return(0);
}

void sighandler(int signum)
{
   printf("シグナル %d を捕捉、ループを抜ける...\n"\n", signum);
   exit(1);
}

上記のプログラムをコンパイルして実行してみましょう。次の結果が得られ、プログラムは無限ループに入るため、CTRL + C キーでプログラムを終了する必要があります。

开始休眠一秒钟...
开始休眠一秒钟...
开始休眠一秒钟...
开始休眠一秒钟...
开始休眠一秒钟...
捕获信号 2,跳出...

C 标准库 - <signal.h>C標準ライブラリ - <signal.h>

その他の拡張