У меня есть исходный код, который был скомпилирован в Windows. Я конвертирую его для работы в Red Hat Linux.
Исходный код включает <windows.h>
файл заголовка, и программист использовал Sleep()
функцию для ожидания в течение миллисекунд. В Linux это не сработает.
Однако я могу использовать sleep(seconds)
функцию, но она использует целое число в секундах. Я не хочу переводить миллисекунды в секунды. Есть ли альтернативная функция сна, которую я могу использовать при компиляции gcc в Linux?
sleep(/*seconds*/)
в<unistd.h>
работает, но если я используюprintf("some things")
без\n
, он не работает.fflush(stdout);
printf()
Ответы:
Да - определены более старые стандарты POSIX
usleep()
, поэтому это доступно в Linux:usleep()
занимает микросекунды , поэтому вам придется умножить ввод на 1000, чтобы засыпать в миллисекундах.usleep()
с тех пор устарел и впоследствии был удален из POSIX; для нового кодаnanosleep()
предпочтительно:Пример
msleep()
функции, реализованной с использованиемnanosleep()
продолжения сна, если он прерван сигналом:источник
Вы можете использовать эту кроссплатформенную функцию:
источник
_POSIX_C_SOURCE >= 199309L
, как в случае-ansi
или-std=c89
, я бы рекомендовал использоватьstruct timeval tv; tv.tv_sec = milliseconds / 1000; tv.tv_usec = milliseconds % 1000 * 1000; select(0, NULL, NULL, NULL, &tv);
вместоusleep(milliseconds * 1000);
. Кредит идет сюда .nanosleep()
документация: man7.org/linux/man-pages/man2/nanosleep.2.html . Было бы полезно разместить ссылки на документацию для каждой используемой здесь функции для конкретной платформы.gcc -Wall -g3 -std=c11 -o sleep_test sleep_test.c && ./sleep_test
на Linux Ubuntu с GCC версии 4.8.4, я получаю следующее предупреждение:warning: implicit declaration of function ‘usleep’ [-Wimplicit-function-declaration]
. Решение состоит в том, чтобы добавить следующие 2 определения в самый верх вашего кода: 1)#define __USE_POSIX199309
и 2)#define _POSIX_C_SOURCE 199309L
. Оба необходимы для компиляции кода без каких-либо предупреждений (а также для использованияnanoseconds()
функции, которая у него есть).В качестве альтернативы тому
usleep()
, что не определено в POSIX 2008 (хотя оно было определено до POSIX 2004 и очевидно доступно на Linux и других платформах с историей соответствия POSIX), стандарт POSIX 2008 определяетnanosleep()
:источник
Помимо usleep , скромный выбор с набором файловых дескрипторов NULL позволит вам делать паузу с точностью до микросекунд и без риска
SIGALRM
осложнений.sigtimedwait и sigwaitinfo предлагают аналогичное поведение.
источник
источник
источник