揮発性のメモ2

知識をメモ書きしておく

Cで、ミリ秒スリープする

#include <stdio.h>
#include <time.h>
#include <signal.h>
#include <errno.h>

/// ちゃんとミリ秒寝る関数
int sleep_msec(long long msec)
{
    struct timespec ts;
    ts.tv_sec = msec/1000;
    ts.tv_nsec = (msec%1000)*1000000;

    int result;
    for(;;){
        result = nanosleep(&ts, &ts);
        if(result==0 || errno!=EINTR) break;
        // puts("もう一度寝るよ");
    }
    return result;
}

/// シグナルハンドラ
void ohayo()
{
    puts("おはよう!");
}

int main()
{
    signal(SIGHUP, ohayo);

    sleep_msec(100000); // 100秒寝る
}

usleep() は時代遅れなので、nanosleep() を使う。

sleep系は、シグナルで起こされたときにはもう一度寝る処理が必要。
(よそでSIGHUPを受けたりすると、ついでに叩き起こされてしまう)

nanosleep() は、2番目の引数に 残り時間を入れてくれる。
このとき、同じ変数を使いまわししても大丈夫。 やったぜ