alarm() - アラームの設定

標準

標準/拡張機能 C/C++ 依存項目

POSIX.1
XPG4
XPG4.2
Single UNIX Specification、バージョン 3

両方

POSIX(ON)

形式

#define _POSIX_SOURCE
#include <unistd.h>

unsigned int alarm(unsigned int seconds);

機能説明

seconds パラメーターで指定した秒数が 経過すると、SIGALRM シグナルを生成します。SIGALRM シグナル・デリバリーは、呼び出しスレッドで指図されます。

seconds は、SIGALRM シグナルが生成される前 に待機する実際の秒数です。プロセッサー遅延のため、SIGALRM シグナルは指定した時間 よりも少し遅れて生成されることがあります。seconds がゼロの場合、事前に設定したアラーム要求 はすべてキャンセルされます。

同時にアクティブにすることができるのは 1 つの アラームだけです。新しいアラーム時刻を設定すると、以前のアラームはすべて キャンセルされます。

この関数がサポートされるのは、POSIX プログラムだけです。

XPG4 の特殊な動作: fork() 関数は、子スレッドで保留アラームをクリアします。 exec 関数の 1 つで作成された新しい スレッド・イメージは、古いスレッド・イメージのアラーム に残された時刻を継承します。

XPG4.2 の特殊な動作:「実際の」インターバル・タイマー (ITIMER_REAL) を 設定するのに setitimer() 関数を使用すると、alarm() は、setitimer() 関数 と相互に影響し合います。

alarm() は、usleep() 関数とは相互に影響し合いません。

戻り値

前のアラーム要求がまだ完了していないと、alarm() は、その要求が SIGALRM シグナルを生成するはず の時間までの残りの秒数を戻します。

時間の残っている以前のアラーム要求がない場合、alarm() は、0 を戻します。alarm() は常に正常終了するため、失敗の戻りはありません。alarm() が正常終了するのを妨げるなんらかの障害が 検出されると、異常終了が生成されます。

CELEBA05
⁄* CELEBA05

   The following example generates a SIGALRM signal.

 *⁄
#define _POSIX_SOURCE
#include <stdio.h>
#include <signal.h>
#include <time.h>
#include <unistd.h>

volatile int footprint=0;

void catcher(int signum) {
  puts("inside signal catcher!");
  footprint = 1;
}

main() {
  struct sigaction sact;
  volatile double count;
  time_t t;

  sigemptyset(&sact.sa_mask);
  sact.sa_flags = 0;
  sact.sa_handler = catcher;
  sigaction(SIGALRM, &sact, NULL);

  alarm(5); ⁄* timer will pop in five seconds *⁄

  time(&t);
  printf("before loop, time is %s", ctime(&t));
  for (count=0; (count<1e10) && (footprint == 0); count++);
  time(&t);
  printf("after loop, time is %s", ctime(&t));

  printf("the sum so far is %.0f¥n", count);

  if (footprint == 0)
    puts("the signal catcher never gained control");
  else
    puts("the signal catcher gained control");
}
出力:
before loop, time is Fri Jun 16 08:37:03 2006
inside signal catcher!
after loop, time is Fri Jun 16 08:37:08 2006
the sum so far is 17417558

関連情報