GNU/Linux >> Linux の 問題 >  >> Linux

C からミリ秒単位の別のスリープ機能はありますか?

usleep() の代わりに 、これは POSIX 2008 では定義されていませんが (POSIX 2004 までは定義されていましたが、POSIX 準拠の歴史を持つ Linux やその他のプラットフォームで利用できることは明らかです)、POSIX 2008 標準では nanosleep() を定義しています。 :

<ブロック引用>

nanosleep - 高解像度睡眠

#include <time.h>
int nanosleep(const struct timespec *rqtp, struct timespec *rmtp);

nanosleep() 関数は、rqtp で指定された時間間隔まで、現在のスレッドの実行を中断させます。 引数が経過したか、呼び出し元のスレッドにシグナルが配信され、そのアクションはシグナルをキャッチする関数を呼び出すか、プロセスを終了することです。中断時間は、引数値がスリープ解決の整数倍に切り上げられるか、システムによる他のアクティビティのスケジューリングのために、要求されたよりも長くなる場合があります。ただし、信号によって中断された場合を除き、中断時間は rqtp で指定された時間より短くならないものとします。 、システム クロック CLOCK_REALTIME によって測定されます。

nanosleep() の使用 関数は、信号の動作またはブロックに影響を与えません。


はい - 古い 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;
}

このクロスプラットフォーム機能を使用できます:

#ifdef WIN32
#include <windows.h>
#elif _POSIX_C_SOURCE >= 199309L
#include <time.h>   // for nanosleep
#else
#include <unistd.h> // for usleep
#endif

void sleep_ms(int milliseconds){ // cross-platform sleep function
#ifdef WIN32
    Sleep(milliseconds);
#elif _POSIX_C_SOURCE >= 199309L
    struct timespec ts;
    ts.tv_sec = milliseconds / 1000;
    ts.tv_nsec = (milliseconds % 1000) * 1000000;
    nanosleep(&ts, NULL);
#else
    if (milliseconds >= 1000)
      sleep(milliseconds / 1000);
    usleep((milliseconds % 1000) * 1000);
#endif
}

Linux
  1. 間違ったパスワードを入力した後、なぜ大きな遅延があるのですか?

  2. Grepはtrue/falseを返すことができますか、それとも代替方法がありますか?

  3. 自然に話すドラゴンの代わりに?

  1. Chronobreak –オープンソースのポモドーロタイマーの代替

  2. time コマンドの出力を Linux のファイルにリダイレクトする方法は?

  3. ミリ秒単位の時間を取得するコマンド

  1. PHP と mod_fcgid:ap_pass_brigade が handle_request_ipc 関数で失敗しました

  2. printf ビルトインを使用して現在の時間をミリ秒またはナノ秒で出力する

  3. 複数のコマンドの実行時間を計る