1. ホーム
  2. c

[解決済み] C言語で、ミリ秒に代わるスリープ関数はありますか?

2022-03-11 09:56:58

質問

Windowsでコンパイルされたソースコードがあります。Red Hat Linuxで実行できるように変換しています。

このソースコードには <windows.h> ヘッダーファイルを使用し、プログラマーは Sleep() 関数でミリ秒単位で待機させます。これは、Linuxでは動作しません。

しかし sleep(seconds) 関数がありますが、これは秒単位の整数を使用します。ミリ秒を秒に変換するのは嫌です。Linuxでgccコンパイルして使える代替のsleep関数はないでしょうか?

どのように解決するのですか?

はい - 古い POSIX 標準化された usleep() ということで、Linuxで利用可能です。

int usleep(useconds_t usec);

説明

usleep()関数は、呼び出したスレッドの実行を一時停止させる。 (少なくとも)usecマイクロ秒。 スリープの時間は、以下の理由により若干長くなる可能性があります。 システムの活動、呼び出しの処理に費やされた時間、あるいは システムタイマーの粒度

usleep() 取る マイクロ秒 ということで、ミリ秒単位でスリープさせるためには、入力に1000を掛ける必要があります。


usleep() は非推奨となり、その後 POSIX から削除されました。新しいコードについては nanosleep() が望ましいとされています。

#include <time.h>

int nanosleep(const struct timespec *req, struct timespec *rem);

説明

nanosleep() で指定された時間以上経過するまで、 呼び出しているスレッドの実行を一時停止する。 *req が経過するか、または のハンドラを呼び出すトリガーとなるシグナルが送られたとき。 呼び出したスレッドまたはプロセスを終了させる。

timespec 構造体は、時間の間隔をナノ秒の精度で指定するために使用されます。 以下のように定義される。

struct timespec {
    time_t tv_sec;        /* seconds */
    long   tv_nsec;       /* nanoseconds */
};

msleep() を使用して実装された関数です。 nanosleep() 信号によって中断された場合、スリープを継続する。

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

/* msleep(): Sleep for the requested number of milliseconds. */
int msleep(long msec)
{
    struct timespec ts;
    int res;

    if (msec < 0)
    {
        errno = EINVAL;
        return -1;
    }

    ts.tv_sec = msec / 1000;
    ts.tv_nsec = (msec % 1000) * 1000000;

    do {
        res = nanosleep(&ts, &ts);
    } while (res && errno == EINTR);

    return res;
}