English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

LinuxでタイマーTimerを実現するいくつかの方法をまとめます

タイマーTimerの応用範囲は非常に広く、Linuxでは以下のような方法があります:

1、sleep()とusleep()を使用して

その中でsleepの精度は1秒、usleepの精度は1微妙、具体的コードは省略します。この方法の欠点は明らかで、Linuxシステムでは、sleepのような関数は精度を保証できません。特にシステムの負荷が大きい場合、sleepは通常タイムアウト現象が発生します。

2、シグナルマシンSIGALRMを使用して + alarm()

この方法の精度は以下となります1秒、その中で*nixシステムのシグナルマシンキック機構、まずシグナルマシンSIGALRMのハンドラを登録し、alarm()を呼び出し、タイマーの長さを設定する、以下のようにコードを記述します:

#include <stdio.h>
#include <signal.h>
void timer(int sig)
{
    if(SIGALRM == sig)
    {
        printf("timer\n");
        alarm(1);    //タイマーを設定し続ける
    }
    return ;
}
int main()
{
    signal(SIGALRM, timer); //シグナルと関数を関連付ける
    alarm(1);    //タイマーをトリガーする
    getchar();
    return 0;
}

alarm方式は良いが、最初に以下よりも低くはならない1秒の精度で

3、RTC機構を使用して

RTC機構はシステムハードウェアが提供するReal Time Clock機構を利用し、RTCハードウェア/dev/rtc,通过ioctl()设置RTC频率,代码如下:

#include <stdio.h>
#include <linux/rtc.h>
#include <sys/ioctl.h>
#include <sys/time.h>
#include <sys/types.h>
#include <fcntl.h>
#include <unistd.h>
#include <errno.h>
#include <stdlib.h>
int main(int argc, char* argv[])
{
    unsigned long i = 0;
    unsigned long data = 0;
    int retval = 0;
    int fd = open ("/dev/rtc", O_RDONLY);
    if(fd < 0)
    {
        perror("open");
        exit(errno);
    }
    /*設定周波数として 4Hz*/
    if(ioctl(fd, RTC_IRQP_SET, 1) < 0)
    {
        perror("ioctl(RTC_IRQP_SET)");
        close(fd);
        exit(errno);
    }
    /* 周期中断启用 */
    if(ioctl(fd, RTC_PIE_ON, 0) < 0)
    {
        perror("ioctl(RTC_PIE_ON)");
        close(fd);
        exit(errno);
    }
    for(i = 0; i < 100; i++)
    {
        if(read(fd, &data, sizeof(unsigned long)) < 0)
        {
            perror("read");
            close(fd);
            exit(errno);
        }
        printf("timer\n");
    }
    /* 周期中断禁用 */
    ioctl(fd, RTC_PIE_OFF, 0);
    close(fd);
    return 0;
}

この方法は非常に便利で、システムのハードウェアが提供するRTCを使用し、精度を調整でき、非常に高くです。

4を使用して、select()

この方法はAPUEの神書を見たときに見つけました。方法は比較的珍しく、select()を使用してタイマーを設定します;原理はselect()メソッドの第5の引数、最初の引数を0に設定し、3つのファイルディスクリプタセットをNULLに設定します、次の5の引数が時間構造体です。以下のコードです:

#include <sys/time.h>
#include <sys/select.h>
#include <time.h>
#include <stdio.h>
/*seconds: 秒; mseconds: 微秒*/
void setTimer(int seconds, int mseconds)
{
    struct timeval temp;
    temp.tv_sec = seconds;
    temp.tv_usec = mseconds;
    select(0, NULL, NULL, NULL, &temp);
    printf("timer\n");
    return ;
}
int main()
{
    int i;
    for(i = 0 ; i< 100; i++)
        setTimer(1, 0);
    return 0;
}

この方法の精度はミクロ秒レベルに達します。ネットワークにはselect()ベースのマルチスレッドタイマーがたくさんあります。これは、select()の安定性が非常に良いことを示しています。

まとめ:システムの要件が低い場合、シンプルなsleep()を使用を検討してください。なぜなら、一行のコードで解決できるからです;システムが高精度を要求する場合は、RTCメカニズムとselect()メカニズムを検討してください。

これで、編集者が皆さんに提供したLinuxでタイマーTimerを実現する方法のいくつかのまとめがすべて終わりました。皆さん、サポートして、叫び教程を応援してください~

基本教程
おすすめ