標準/拡張機能 | C/C++ | 依存項目 |
---|---|---|
POSIX.1 |
両方 | 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
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