0

私は定期的なタイマーを使用していて、2 つのSIGALRM信号が受信される間に時間をとっていました。私が観察したのはitimer、設定した時間の少し前または少し後に期限切れになる可能性があるということでした. たとえば、 に設定した場合、または1m secで期限切れになる可能性があります。0.9998msec1.0023msec

タイマーの有効期限は、設定されている値よりも常に大きくなるはずではありませんか? 時間がかからないことは、私が理解していないことです。

ここに私のコードがあります:

enter code here     
#include <stdio.h>
#include <signal.h>
#include <sys/time.h>
#include <stdlib.h>
#include <time.h>

#define INTERVAL 1000


struct timespec ti[100];
int s=0;


void ex(int i)
{int d=0;
struct timespec t[100],s1,s2;
   for(d=0;d<99;d++)
    {
    s1= ti[d];
    s2= ti[d+1];
   printf("%u:%u\t%u:%u\t", s1.tv_sec, s1.tv_nsec, s2.tv_sec, s2.tv_nsec);

    if ((s2.tv_nsec- s1.tv_nsec)<0) {
        t[d].tv_sec = s2.tv_sec-s1.tv_sec-1;
        t[d].tv_nsec = 1000000000 +s2.tv_nsec -s1.tv_nsec;
    } else {
        t[d].tv_sec = s2.tv_sec-s1.tv_sec;
        t[d].tv_nsec = s2.tv_nsec-s1.tv_nsec;
    }

    printf("%u:%u\n",t[d].tv_sec,t[d].tv_nsec);  

    } 
   exit(0);
}

void alarm_wakeup (int i)
{  
   clock_gettime(CLOCK_MONOTONIC, &ti[s]); 
    s++;
    if(s==100)
    { ex(0);
    }
}


void main ()
{
  struct itimerval tout_val;
  tout_val.it_interval.tv_sec = 0;
  tout_val.it_interval.tv_usec = INTERVAL;
  tout_val.it_value.tv_sec = 0; 
  tout_val.it_value.tv_usec = INTERVAL;


  setitimer(ITIMER_REAL, &tout_val,0);

  signal(SIGALRM,alarm_wakeup); /* set the Alarm signal capture */
 signal(SIGINT,ex);

  while (1)
{ 
}

}
4

1 に答える 1

0

タイマーが時間切れになると、信号が発生し、タイマーが再スケジュールされます。

ただし、信号が発生してから処理されるまでに遅延が発生する可能性があります。プロセスがまだ実行されていない場合は、スケジュールを変更する必要があります。これは、タイマーの実際の満了とclock_gettime()シグナルハンドラーの呼び出しが実行されるまでの間に潜在的に可変の遅延があることを意味します。

呼び出し前のこの遅延clock_gettime()が次の反復よりも1回の反復よりも大きい場合clock_gettime()、後続のタイマーの有効期限の間に1ミリ秒のギャップがあったとしても、呼び出し間の時間は1ミリ秒よりわずかに短くなります。

ダイアグラム形式:

time:                0ms...............1ms...............2ms...............3ms
timer expiry:        X                 X                 X                 X
signal handler runs:  S                      S            S                  S

2番目のシグナルハンドラーが実行されるまでの遅延が長いため、基になるタイマーが実行されていなくても、3番目のシグナルが「早期」に見えることがわかります。

于 2012-10-05T04:01:29.020 に答える