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


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

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

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

6   92   2009-07-21 07:49:33

6 ответов:

да - старше 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 истек, или доставка сигнала, который вызывает вызов обработчика в системе вызов потока или завершение процесса.

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

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

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

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

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

nanosleep - высокое разрешение спать

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

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

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

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

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

#include <unistd.h>

int usleep(useconds_t useconds); //pass in microseconds
#include <stdio.h>
#include <stdlib.h>
int main () {

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

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


return 0;
}