C言語入門講座。関数、サンプル集を参考にして、 C言語をマスターしよう。初心者から上級者まで。

シグナルを送る

2012.08.10

raise関数は、この関数を呼び出したプロセスにシグナルを送ります。

#include <signal.h>
int raise(int signum);

signumは送るシグナルを指定します。

戻り値として、正常に送れた場合は0を、送れなかった場合は0以外を返します。

第1引数のsignumに指定できる値は、signal.hファイルに定義されています。また、UNIX系OSの場合は、kill -lコマンドで表示できます。

次の例題プログラムは0又は、SIGINTシグナル(CtrlキーとCキーを同時に押下することにより発生)を3回発行すると終了します。

プログラム 例

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

/* ユーザ定義関数の宣言 */
void SetSignal(int SignalName);
void SigHandler(int SignalName);
void Input(void);

int main(void)
{
  SetSignal(SIGINT);

  Input();

  return 0;
}

void Input(void)
{
  int    in_data;

  printf('0又はCtl+Cを3回入力すると終了します\n');
  while(1) {
    printf('整数を入力してください ==> ');
    scanf('%d', &in_data);

    if (in_data == 0) {
      raise(SIGINT);
    }
  }

  return;
}

/* シグナルの設定 */
void SetSignal(int p_signame)
{
  if (signal(p_signame, SigHandler) == SIG_ERR) {
    /* シグナル設定エラー  */
    printf('シグナルの設定が出来ませんでした。終了します\n');
    exit(1);
  }

  return;
}

/* シグナル受信/処理 */
void SigHandler(int p_signame)
{
  static int   sig_cnt = 0;

  ++sig_cnt;
  if (sig_cnt <= 2) {
    putchar(0x07);           /* ベルを鳴らす */
    fflush(stdout);
  }
  else {
    printf('\n%d回目の割り込みです。終了します\n', sig_cnt);
    exit(0);
  }

  /* シグナルの再設定 */
  SetSignal(p_signame);

  return;
}

例の実行結果

Ctl+Cを1回入力しています。

$ ./raise.exe
0又はCtl+Cを3回入力すると終了します
整数を入力してください ==> 1
整数を入力してください ==> 2
整数を入力してください ==> 0
整数を入力してください ==> 4
整数を入力してください ==> 5
整数を入力してください ==> 6
整数を入力してください ==> 7
整数を入力してください ==> 8
整数を入力してください ==> 0

3回目の割り込みです。終了します
$

関連記事