- What Is sleep() function and How To Use It In C Program?
- Include unistd.h Library In Linux
- Include windows.h Library In Windows
- Cross-Platform Library Solution
- Sleep Example App
- Sleep For 10 Second
- Sleep For 100 millisecond
- Sleep Microsecond with usleep() Function
- Return Value
- C Program to Sleep in Milliseconds
- Using usleep()
- Using nanosleep()
- Using select()
- Author: Srikanta
- Есть ли альтернативная функция сна в C до миллисекунд?
- 6 ответов:
- Есть ли альтернативная функция сна в C до миллисекунд?
- 6 ответов
- Как спать за миллисекунду в bash или ksh
- 6 ответов
What Is sleep() function and How To Use It In C Program?
C programming language provides sleep() function in order to wait for a current thread for a specified time. slepp() function will sleep given thread specified time for the current executable. Of course, the CPU and other processes will run without a problem.
Include unistd.h Library In Linux
sleep() function is provided by unistd.h library which is a short cut of Unix standard library. We can include this library as below.
Include windows.h Library In Windows
If we are writing an application which will run on the windows platform we should include windows.h library like below.
Cross-Platform Library Solution
Actually there is no cross plat format default library. But we can write our application which will use the proper library according to compile architecture. In this case, we will use _WIN32 constant which will put the appropriate library accordingly.
Sleep Example App
In this part, we will use sleep() function in an example. In this example, we want to sleep for 1 second. As we can see the parameter will be 1 which is an integer.
Sleep For 10 Second
We can also sleep for 10 seconds without a problem. We will just provide the 10 to the sleep function like below.
Sleep For 100 millisecond
As stated previously the sleep function will interpret given value as the second. What if we need to sleep in milliseconds which is lower than second. We can use decimal or float values. In this example, we will sleep for 10 millisecond which can be expressed like 0.01 or 0.010
Sleep Microsecond with usleep() Function
We can also use usleep() function which will sleep given value in a microsecond. In this case, we will sleep for 10 microsecond with usleep() function.
Return Value
The sleep() function will return void which means it will not return anything.
Источник
C Program to Sleep in Milliseconds
We don’t have millisecond level control in the sleep() function. But in Linux we can implement our own function that will take duration in milliseconds as input and sleep for that duration.
Using usleep()
The usleep() function takes the duration in micro seconds as input. We can have a wrapper around this usleep() function that will take the duration in millisecond. We can simply pass that duration multiplied by 1000 to usleep() function.
This is good enough solution. But thing is that the usleep() function is now deprecated. We have few other options also.
Using nanosleep()
We can implement our msleep() function using nanosleep() that takes timespec structure as input. It has nano second level control. We can convert the input milliseconds into seconds and nanoseconds before calling the nanosleep() function.
You might notice that there is a loop around nanosleep() function. To understand this we need to understand the behavior of nanosleep() function.
From the nanospleep() man page.
nanosleep() suspends the execution of the calling thread until either at least the time specified in *req has elapsed, or the delivery of a signal that triggers the invocation of a handler in the calling thread or that terminates the process.
If the call is interrupted by a signal handler, nanosleep() returns -1, sets errno to EINTR, and writes the remaining time into the structure pointed to by rem unless rem is NULL. The value of *rem can then be used to call nanosleep() again and complete the specified pause.
If the function gets interrupted before the specified time is elapsed, the return value (ret) would be -1 and the errno would be EINTR. As we passed ts as both parameters, remaining time will be set to the ts itself. We are calling the function with remaining time (modified ts). This process will continue until the total specified time is elapsed.
Using select()
We use select() function to check whether a file descriptor is set. If we don’t pass any file descriptor, then it will time out after the specified timeout. Here also we’ll have millisecond level control.
The timeval structure takes the duration in seconds and microseconds. We converted the input milliseconds into seconds and microseconds and passed that in select() function as timeout.
Author: Srikanta
I write here to help the readers learn and understand computer programing, algorithms, networking, OS concepts etc. in a simple way. I have 20 years of working experience in computer networking and industrial automation. View all posts by Srikanta
If you also want to contribute, click here.
Источник
Есть ли альтернативная функция сна в C до миллисекунд?
у меня есть исходный код, который был скомпилирован на Windows. Я конвертирую его для работы на Red Hat Linux.
исходный код включил заголовочный файл и программист использовал Sleep() функция для ожидания в течение нескольких миллисекунд. Это не будет работать на Linux.
однако, я могу использовать sleep(seconds) функция, но это использует целое число в секундах. Я не хочу конвертировать миллисекунды в секунды. Есть ли альтернативная функция сна, которую я могу использовать с компиляцией gcc на Linux?
6 ответов:
да — старше POSIX стандартами usleep() , так что это доступно на Linux:
функции usleep() приостанавливает выполнение вызывающего процесса для (по крайней мере) МКС МКС. Сон может быть немного удлинен любая системная активность или время, затраченное на обработку вызова, или степень детализации системы таймеры.
usleep() принимает микросекунд, так что вам придется умножить вход на 1000, чтобы спать в миллисекундах.
usleep() С тех пор был устаревшим и впоследствии удален из POSIX; для нового кода, nanosleep() предпочтительно:
nanosleep() приостанавливает выполнение вызывающего потока до тех пор, пока по крайней мере время, указанное в *req истек, или доставка сигнала, который вызывает вызов обработчика в системе вызов потока или завершение процесса.
структура timespec используется для указания интервалов времени с точностью до наносекунды. Он определяется следующим образом:
вы можете использовать эту кросс-платформенную функцию:
вместо usleep() , который не определен в POSIX 2008 (хотя он был определен до POSIX 2004, и он, очевидно, доступен на Linux и других платформах с историей соответствия POSIX), стандарт POSIX 2008 определяет nanosleep() :
nanosleep — высокое разрешение спать
The nanosleep() функция должна заставить текущий поток быть приостановлен от выполнения до любого временного интервала указывается с помощью rqtp аргумент истек или сигнал поступает в вызывающий поток, и его действие заключается в вызове функции захвата сигнала или завершении процесса. Время приостановки может быть больше, чем требуется, потому что значение аргумента округляется до целого числа, кратного разрешению сна, или из-за планирования другой активности системой. Но, за исключением случая прерывания сигналом, время приостановки не должно быть меньше указанного времени. на rqtp , как измеряется системными часами CLOCK_REALTIME.
использование nanosleep() функция не влияет на действие или блокировку любого сигнала.
Beyond usleep скромный выберите с нулевыми наборами дескрипторов файлов позволит вам сделать паузу с точностью до микросекунды и без риска SIGALRM осложнения.
Источник
Есть ли альтернативная функция сна в C до миллисекунд?
у меня есть исходный код, который был скомпилирован в Windows. Я конвертирую его для работы на Red Hat Linux.
исходный код включил заголовочный файл, и программист использовал Sleep() функция для ожидания периода миллисекунд. Это не будет работать на Linux.
тем не менее, я могу использовать sleep(seconds) функция, но которая использует integer в секундах. Я не хочу преобразовывать миллисекунды в секунды. Есть ли альтернативная функция сна, которую я могу использовать с компиляцией gcc в Linux?
6 ответов
да — старше POSIX стандартами usleep() , так что это доступно на Linux:
функции usleep() приостанавливает выполнение вызывающего процесса для (по крайней мере) МКС МКС. Сон может быть немного удлинен любая системная активность или время, затраченное на обработку вызова или гранулярность системы таймеры.
usleep() принимает микросекунд, поэтому вам придется умножить вход на 1000, чтобы спать в миллисекундах.
usleep() С тех пор устарел и впоследствии удален из POSIX; для нового кода nanosleep() предпочтительно:
nanosleep() приостанавливает выполнение вызывающего потока по крайней мере до времени, указанного в *req истек, или доставка сигнала, который вызывает вызов обработчика в вызов thread или который завершает процесс.
timespec структуры использован для того чтобы определить интервалы времени с точностью наносекунды. Он определяется следующим образом:
вы можете использовать эту кросс-платформенную функцию:
вместо usleep() , который не определен в POSIX 2008 (хотя он был определен до POSIX 2004, и он, очевидно, доступен на Linux и других платформах с историей соответствия POSIX), стандарт POSIX 2008 определяет nanosleep() :
nanosleep — высокое разрешение спать
The nanosleep() функция должна привести к приостановке выполнения текущего потока до любого временного интервала указано rqtp аргумент истек или сигнал передается вызывающему потоку, и его действие заключается в вызове функции улавливания сигнала или завершении процесса. Время приостановки может быть больше, чем требуется, поскольку значение аргумента округляется до целого числа, кратного разрешению сна, или из-за планирования других действий системой. Но, за исключением случая прерывания сигналом, время приостановки не должно быть меньше указанного времени. by rqtp , измеряется системными часами CLOCK_REALTIME.
использование nanosleep() функция не влияет на действие или блокировку любого сигнала.
дальше usleep скромный выберите с нулевыми наборами дескрипторов файлов позволит вам сделать паузу с точностью до микросекунды, и без риска SIGALRM осложнения.
sigtimedwait и sigwaitinfo предложить аналогичное поведение.
Источник
Как спать за миллисекунду в bash или ksh
sleep — очень популярная команда, и мы можем начать сон с 1 секунды:
но какая альтернатива, если мне нужно подождать всего 0,1 секунды или от 0,1 до 1 секунды?
- примечание: на linux sleep 0.XXX работает отлично, но на солярии sleep 0.1 или sleep 0.01 — незаконный синтаксис
6 ответов
У Bash есть «загружаемый» сон, который поддерживает дробные секунды и устраняет накладные расходы внешней команды:
Недостатком является то, что загружаемые файлы могут быть не снабжены двоичным кодом bash , поэтому вам нужно будет их самостоятельно скомпилировать, как показано (хотя на Solaris это не обязательно будет так просто, как описано выше).
По состоянию на bash-4.4 (сентябрь 2016 г.) все загружаемые ресурсы теперь построены и установлены по умолчанию на поддерживающих его платформах, хотя они построены как отдельные общие, объектных файлов и без суффикса .so . Если ваш дистрибутив /ОС не сделал что-то творческое, вы должны иметь возможность сделать это:
(В man-странице подразумевается BASH_LOADABLES_PATH устанавливается автоматически, я считаю, что это не относится к официальному дистрибутиву по версии 4.4.12. Если и когда он установлен правильно, вам нужно всего лишь enable -f filename commandname по мере необходимости.)
Если это не подходит, следующая простая задача — сборка или получение sleep из GNU coreutils, что поддерживает требуемую функцию. Команда POSIX sleep минимальна, старше Реализованы только версии Solaris. Solaris 11 sleep выполняет поддержку дробных секунд.
В качестве последнего средства вы можете использовать perl (или любые другие скрипты, которые должны иметь) с предостережением, что инициализация интерпретатора может быть сопоставима с предполагаемым временем ожидания:
Документация для sleep команды от coreutils говорит:
Исторические реализации сна требуют, чтобы это число было целое число и принимает только один аргумент без суффикса. Однако сон GNU принимает произвольные числа с плавающей запятой. Видеть плавающая точка .
Следовательно, вы можете использовать sleep 0.1 , sleep 1.0e-1 и аналогичные аргументы.
Сон принимает десятичные числа, поэтому вы можете разбить его так:
Источник