コマンドラインから3つの異なる引数を受け取ることになっているプログラムがあります。3 番目の引数は、アラーム関数に渡される唯一の引数です。たとえば、私のプログラムが BuzzOff という名前の場合、次のように動作します。
$ BuzzOff 10 99999 1
3 番目の引数は 1 であるため、1 がアラーム関数に渡されます。私のプログラムは、変数 total の値を arg3 秒ごとに出力する必要があります。この場合、1秒ごと。しかし、3 番目の引数として 1 を使用しようとすると、アラームに 1 秒よりもはるかに長い時間がかかります。約14秒かかります。arg3として何を使用しても同じ速度で印刷されるようです。アラーム機能を正しく実装していますか?
これが私のコードです:
#include<stdio.h>
#include<signal.h>
#include<stdlib.h>
double arg1, arg2, arg3;
double total = 0;
int debug = 0;
void sigusr1_handler(int signo)
{
if (signo == SIGUSR1)
printf("total: %f\n", total);
}
void sigusr2_handler(int signo)
{
if (signo == SIGUSR2)
debug = ((debug == 1) ? 0 : 1);
}
void sigint_handler(int signo)
{
if (signo == SIGINT)
{
printf("total: %f\n", total);
exit(0);
}
}
void sigalrm_handler(int signo)
{
if (signo == SIGALRM)
{
printf("total: %f\n", total);
signal(SIGALRM, sigalrm_handler);
alarm(arg3);
}
}
int main(int argc, char *argv[])
{
if( argc!=4 ) {
printf("need three arguments\n"); return(1);
}
arg1 = (double) atoi(argv[1]);
arg2 = (double) atoi(argv[2]);
arg3 = (double) atoi(argv[3]);
double count;
signal(SIGUSR1, sigusr1_handler);
signal(SIGUSR2, sigusr2_handler);
raise(SIGUSR2);
if (debug == 1)
{
signal(SIGUSR1, SIG_IGN);
signal(SIGALRM, sigalrm_handler);
alarm(arg3);
}
else if (debug == 0)
{
signal(SIGUSR1, sigusr1_handler);
signal(SIGINT, sigint_handler);
}
for (count = 0; count < arg2; count += 0.001)
{
total += count*arg1;
}
return 0;
}