Есть ли альтернативная функция сна в C до миллисекунд? - PullRequest
113 голосов
/ 21 июля 2009

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

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

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

Ответы [ 6 ]

156 голосов
/ 21 июля 2009

Да - более старые 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);
* 1 028 * ОПИСАНИЕ * +1029 *

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

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

       struct timespec {
           time_t tv_sec;        /* seconds */
           long   tv_nsec;       /* nanoseconds */
       };
40 голосов
/ 03 марта 2015

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

#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
}
31 голосов
/ 21 июля 2009

В качестве альтернативы 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, измеренного системными часами CLOCK_REALTIME.

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

24 голосов
/ 21 июля 2009

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

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

13 голосов
/ 21 июля 2009
#include <unistd.h>

int usleep(useconds_t useconds); //pass in microseconds
0 голосов
/ 09 августа 2018
#include <stdio.h>
#include <stdlib.h>
int main () {

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

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


return 0;
}
...