179

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

ソース コードには<windows.h>ヘッダー ファイルが含まれており、プログラマはSleep()関数を使用してミリ秒待機しています。これは Linux では機能しません。

ただし、sleep(seconds)関数を使用できますが、整数を秒単位で使用します。ミリ秒を秒に変換したくありません。Linux での gcc コンパイルで使用できる別のスリープ機能はありますか?

4

6 に答える 6

232

はい - 古い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;
}
于 2009-07-21T03:52:07.567 に答える
33

POSIX 2008 で定義されていない の代わりにusleep()(ただし、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()機能を使用しても、信号の動作やブロックには影響しません。

于 2009-07-21T04:02:11.710 に答える
25

usleepを超えて、NULL ファイル記述子セットを使用した謙虚な選択SIGALRMにより、複雑化のリスクなしに、マイクロ秒の精度で一時停止できます。

sigtimedwait と sigwaitinfoは同様の動作を提供します。

于 2009-07-21T03:58:14.527 に答える
15
#include <unistd.h>

int usleep(useconds_t useconds); //pass in microseconds
于 2009-07-21T03:58:17.647 に答える