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

はい - 古い POSIX 標準で定義された usleep() であるため、これは Linux で利用できます:

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

usleep() その後廃止され、その後 POSIX から削除されました。新しいコードの場合、nanosleep() 推奨:

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
}

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