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

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

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

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

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

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 аргумент истек или сигнал передается вызывающему потоку, и его действие заключается в вызове функции улавливания сигнала или завершении процесса. Время приостановки может быть больше, чем требуется, поскольку значение аргумента округляется до целого числа, кратного разрешению сна, или из-за планирования других действий системой. Но, за исключением случая прерывания сигналом, время приостановки не должно быть меньше указанного времени. by rqtp, измеряется системными часами CLOCK_REALTIME.

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


дальше 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;
}