Есть ли альтернативная функция сна в C до миллисекунды?

У меня есть исходный код, который был скомпилирован в Windows. Я конвертирую его в Red Hat Linux.

Исходный код включает заголовочный файл <windows.h>, и программист использовал функцию Sleep() для ожидания периода в миллисекундах. Это не будет работать в Linux.

Однако я могу использовать функцию sleep(seconds), но она использует целое число в секундах. Я не хочу конвертировать миллисекунды в секунды. Есть ли альтернативная функция сна, которую я могу использовать с компиляцией gcc в Linux?

Ответ 1

Да - более старые стандарты POSIX определены usleep(), так что это доступно в Linux:

   int usleep(useconds_t usec);

ОПИСАНИЕ

Функция usleep() приостанавливает выполнение вызывающего потока для        (по крайней мере) использовать микросекунды. Сон может быть немного удлинен        любая системная активность или время, потраченное на обработку вызова, или        гранулярность системных таймеров.

usleep() занимает микросекунды, поэтому вам придется умножить ввод на 1000, чтобы спать в миллисекундах.


usleep() с тех пор устарела и впоследствии удалена из POSIX; для нового кода предпочтительнее nanosleep() :

   #include <time.h>

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

ОПИСАНИЕ

nanosleep() приостанавливает выполнение вызывающего потока до тех пор, пока не истечет хотя бы время, указанное в *req, или пока доставка сигнала, который запускает вызов обработчика в вызывающий поток или завершающий процесс.

Структура timepec используется для указания интервалов времени с точностью до наносекунды. Он определяется следующим образом:

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

Пример функции msleep(), реализованной с использованием nanosleep(), продолжающей спящий режим, если он прерывается сигналом:

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;
}

Ответ 2

Вы можете использовать эту кросс-платформенную функцию:

#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
    usleep(milliseconds * 1000);
#endif
}

Ответ 3

В качестве альтернативы usleep(), который не определен в POSIX 2008 (хотя он был определен до POSIX 2004, и он, очевидно, доступен на Linux и других платформах с историей соответствия POSIX), стандарт POSIX 2008 определяет nanosleep():

nanosleep - с высоким разрешением

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

Функция nanosleep() должна приостанавливать текущий поток от выполнения до тех пор, пока не rqtp временной интервал, заданный аргументом rqtp, или сигнал не будет передан вызывающему потоку, а его действие вызовет функцию захвата сигнала или прекратите процесс. Время приостановки может быть больше, чем запрошено, потому что значение аргумента округляется до целого числа, кратного разрешению сна, или из-за планирования другой активности системой. Но, за исключением случая прерывания сигнала, время приостановки не должно быть меньше времени, указанного rqtp, как измерено системным часом CLOCK_REALTIME.

Использование функции nanosleep() не влияет на действие или блокировку любого сигнала.

Ответ 4

Вне usleep, скромный select с наборами дескрипторов файлов NULL позволит вам делать паузу с точностью до микросекунды и без риска осложнений SIGALRM.

sigtimedwait и sigwaitinfo предлагают аналогичное поведение.

Ответ 5

#include <unistd.h>

int usleep(useconds_t useconds); //pass in microseconds

Ответ 6

#include <stdio.h>
#include <stdlib.h>
int main () {

puts("Program Will Sleep For 2 Seconds");

system("sleep 2");      // works for linux systems


return 0;
}