2016-07-14 18 views
0

Cプログラムですべての整数を取得する方法があるのだろうかと思います。私は 'gettimeofday'関数を使って現在の時刻を取得しようとしました。そして、現在の秒の小数部分が(0.9より大きく0.1より小さい)領域に入ると、現在の時刻を整数に丸めました。しかし、私がプログラムを実行すると、時折、数秒が欠落していました。誰かがより良い解決策を持っていますか?cプログラムですべての整数を取得する方法

おかげ

+0

OSとは何ですか?コンピュータは他に何をしていますか?ユースケースは何ですか? –

+0

オペレーティングシステムはUNIXであり、MACでもテストされています。私はちょうどプロセスを実行しました。他のプロセスは実行されていません。すべての整数をグローバル変数に代入して参照として使用したいだけです – Toga

+0

どのくらいの頻度で 'gettimeofday'を呼び出していますか? –

答えて

0

私はアラーム信号を使用することをお勧め:私を得る私のMac(OS X 10.11.5)で

#include <signal.h> 
#include <stdio.h> 
#include <string.h> 
#include <unistd.h> 
#include <sys/time.h> 

void timer_handler (int signum) 
{ 
    struct timeval tval; 
    gettimeofday(&tval, NULL); 
    printf("Seconds: %ld\n",tval.tv_sec); 
} 

int main() 
{ 
    struct sigaction sa; 
    struct itimerval timer; 

    memset (&sa, 0, sizeof (sa)); 
    sa.sa_handler = &timer_handler; 
    sigaction (SIGVTALRM, &sa, NULL); 

    timer.it_value.tv_sec = 1; 
    timer.it_value.tv_usec = 0; 
    timer.it_interval.tv_sec = 1; 
    timer.it_interval.tv_usec = 0; 
    setitimer (ITIMER_VIRTUAL, &timer, NULL); 

    while (1); 
} 

を:

./alarm
秒を:1468937712
秒数:1468937713
秒数:1468937714
秒:1468937715
秒:1468937716
秒:1468937717
秒:1468937718
秒:1468937719
秒:1468937720

EDIT

上記のコードは、仮想タイマーを使用し、スレッドが実行されている時間が長いだけです(したがって、高負荷を導入するビジーループに依存します)。実際のタイマーを使用すると、負荷を減らすことができます。

#include <signal.h> 
#include <stdio.h> 
#include <string.h> 
#include <unistd.h> 
#include <sys/time.h> 
#include <pthread.h> 

void timer_handler (int signum) 
{ 
    struct timeval tval; 
    printf("Foo"); 
    gettimeofday(&tval, NULL); 
    printf("Seconds: %ld\n",tval.tv_sec); 
} 

int main() 
{ 
    struct sigaction sa; 
    struct itimerval timer; 
    sa.sa_mask=0; 
    sa.sa_flags=0; 


    memset (&sa, 0, sizeof (sa)); 
    sa.sa_handler = &timer_handler; 
    sigaction (SIGALRM, &sa, NULL); 

    timer.it_value.tv_sec = 1; 
    timer.it_value.tv_usec = 0; 
    timer.it_interval.tv_sec = 1; 
    timer.it_interval.tv_usec = 0; 
    setitimer (ITIMER_REAL, &timer, NULL); 

    while (1){ 
    pthread_yield_np(); 
    } 
} 

このアプローチは、基本的にタイマーハンドラだけを実行します。したがって、OSは負荷についてあまり気にしないでください。ただし、ハードのリアルタイム保証機能は、リアルタイム機能でのみ取得できます(存在する場合)。

+0

コードをありがとう。私は短い時間のコードを実行し、それは正常に動作します。私は秒がない場合に備えて、より長い時間間隔をテストする必要があります。 1つの問題は、このコードではCPU使用量が多すぎることです。私はそれをより効率的にすることができるかどうかを知る必要があります。 – Toga

+0

私はこの時間を長く実行します。実際にはいくつかの秒が欠落しています。 1秒ごとに出力するコードを強化する考えはありますか? – Toga

+0

時間のかかる部分はアイドルループです。私はミスがOSの公正さの決定に起因すると想像することができました。負荷を減らすために私の答えを編集します。 – Matthias

関連する問題