2016-07-08 8 views
1

ここでは、0〜10秒と2秒の間隔でタイマーを達成しようとしていますので、毎秒2秒ごとに割り込みを生成する必要があります2秒が完了しました。私はprintf()を使ってhandler()関数をチェックしています。しかし、私は希望の結果を達成することができません。誰かがそれを認識していれば私に触れさせてください。timer_create()はハンドラ関数内のシグナルをキャッチすることができません

ありがとうございます。

#include <stdlib.h> 
#include <unistd.h> 
#include <stdio.h> 
#include <signal.h> 
#include <time.h> 
#define SIGTIMER        (SIGRTMAX) 
     #define errExit(msg) do { perror(msg); exit(EXIT_FAILURE); \ 
           } while (0) 



     void handler(int sig, siginfo_t *si, void *uc) 
     { 
         printf("Caught signal %d\n", sig); 

     } 

     int 
     main(int argc, char *argv[]) 
     { 
      timer_t timerid; 
      struct sigevent sev; 
      struct itimerspec its; 
      struct itimerspec oitval; 

      struct sigaction sa; 

      /* Establish handler for timer signal */ 

      printf("Establishing handler for signal %d\n", SIGTIMER); 
      sa.sa_flags = SA_SIGINFO; 
      sa.sa_sigaction = handler; 
      sigemptyset(&sa.sa_mask); 
      if (sigaction(SIGTIMER, &sa, NULL) == -1) 
       errExit("sigaction"); 

      /* Create the timer */ 

      sev.sigev_notify = SIGEV_SIGNAL; 
      sev.sigev_signo = SIGTIMER; 
      sev.sigev_value.sival_ptr = &timerid; 
      if (timer_create(CLOCK_REALTIME, &sev, &timerid) == 0) 
      { 
      printf("timer ID is 0x%lx\n", (long) timerid); 

      /* Start the timer */ 

      its.it_value.tv_sec = 10; 
      its.it_value.tv_nsec =0; 
      its.it_interval.tv_sec = 2; 
      its.it_interval.tv_nsec = 0; 

      if (timer_settime(timerid, 0, &its, &oitval) == -1) 
       errExit("timer_settime"); 
      } 
      else 
      { 
       errExit("timer_create"); 
      } 

      return 0; 
     } 
+0

"* ...私は希望の結果を達成することができません*"しかし、正確に何を観察しますか? – alk

+0

私はprintf()をテスト目的のためだけに使用しましたが、あなたのコメントのために多くのご協力ありがとうございました。 –

答えて

0

まず第一に、あなたべき適切に設定タイムアウト:

 /* Start the timer */ 

     its.it_value.tv_sec  = 2; 
     its.it_value.tv_nsec = 0; 
     its.it_interval.tv_sec = 2; 
     its.it_interval.tv_nsec = 0; 

it_valueは最初のトリガの前の期間で、it_intervalは、後続のすべてのtriggeringsの間の時間です。 hereを参照してください。その後、プロセスの終了につながるので、main()から戻ってはならず、タイマーティックを見ることができなくなります。何らかの形で実行をブロックする必要があります。 EINTRからerrno設定した各目盛りsleep()戻った後

while(1) sleep(INT_MAX); 

はので、それは、私たちはタイマーが先に行くことができるようにループにラップする必要があります。後でこのループを終了して終了するタイミングを決めることができます。

P.S.シグナルハンドラからのprintf()の使用はお勧めできません。あなたはそこで何をしているのか非常に注意深くすべきです。いくつかのグローバル変数に書き込んですぐに戻るのが良いでしょう。そして、あなたが再び眠るべきか、戻ってくるべきかを知るために、varはsleep()の直後にテストされるかもしれません。

関連する問題