usleep — Приостанавливает выполнение на заданное количество микросекунд

Описание функций языка Си

All | _ | A | B | C | D | E | F | G | H | I | J | K | L | M | N | O | P | Q | R | S | T | U | V | W | X | Y | Z

usleep – приостановка работы потока

#include
int usleep (useconds_t usec);

useconds_t usec – время задержки в микросекундах

0 — если истекло время приостановки, указанное в аргументе функции,

-1 — если приостановка была прервана сигналом

Функция usleep приостанавливает работу потока, в котором она была вызвана, на указанное в аргументе время в микросекундах или до поступления сигнала по которому вызывается функция обработки сигналов или программа завершает свою работу.

Если разрешающая способность системных часов меньше чем 1 микросекунда и указанный интервал не кратен разрешающей способности, то он будет округлен до большего значения, кратного разрешающей способности.

Продолжительность остановки потока управления не может быть меньше указанного времени, если остановка не была прервана сигналом. Однако время приостановки может быть больше, указанного времени из-за накладных расходов или если в момент окончания приостановки работал более приоритетный поток.

Приостановка потока с помощью функции usleep () не оказывает влияния на обработку сигналов

В примере с помощью функции usleep () приостанавливается работа программы на одну миллисекунду пять раз.

Thread. Sleep Метод

Определение

Приостанавливает текущий поток на заданное время. Suspends the current thread for the specified amount of time.

Перегрузки

Приостанавливает текущий поток на заданное количество миллисекунд. Suspends the current thread for the specified number of milliseconds.

Приостанавливает текущий поток на заданное время. Suspends the current thread for the specified amount of time.

Sleep(Int32)

Приостанавливает текущий поток на заданное количество миллисекунд. Suspends the current thread for the specified number of milliseconds.

Параметры

Количество миллисекунд, на которое приостанавливается поток. The number of milliseconds for which the thread is suspended. Если значение аргумента millisecondsTimeout равно нулю, поток освобождает оставшуюся часть своего интервала времени для любого потока с таким же приоритетом, готовым к выполнению. If the value of the millisecondsTimeout argument is zero, the thread relinquishes the remainder of its time slice to any thread of equal priority that is ready to run. Если других готовых к выполнению потоков с таким же приоритетом нет, выполнение текущего потока не приостанавливается. If there are no other threads of equal priority that are ready to run, execution of the current thread is not suspended.

Исключения

Значение времени ожидания является отрицательной величиной и не равно Infinite. The time-out value is negative and is not equal to Infinite.

Примеры

В следующем примере используется метод Sleep для блокировки основного потока приложения. The following example uses the Sleep method to block the application’s main thread.

Комментарии

Выполнение потока не будет запланировано операционной системой на указанный период времени. The thread will not be scheduled for execution by the operating system for the amount of time specified. Этот метод изменяет состояние потока, чтобы оно включало WaitSleepJoin. This method changes the state of the thread to include WaitSleepJoin.

Можно указать Timeout.Infinite для параметра millisecondsTimeout , чтобы приостановить поток бесконечно. You can specify Timeout.Infinite for the millisecondsTimeout parameter to suspend the thread indefinitely. Однако рекомендуется использовать другие классы System.Threading, такие как Mutex, Monitor, EventWaitHandle или Semaphore, а также синхронизировать потоки или управлять ресурсами. However, we recommend that you use other System.Threading classes such as Mutex, Monitor, EventWaitHandle, or Semaphore instead to synchronize threads or manage resources.

Системные тактовые импульсы с заданной скоростью, называемой разрешением часов. The system clock ticks at a specific rate called the clock resolution. Фактическое время ожидания может быть не равно указанному времени ожидания, так как указанное время ожидания будет изменено в соответствии с тактами времени. The actual timeout might not be exactly the specified timeout, because the specified timeout will be adjusted to coincide with clock ticks. Дополнительные сведения о разрешении часов и времени ожидания см. в разделе функция спящего режима . For more information on clock resolution and the waiting time, see the Sleep function topic. Этот метод вызывает функцию Sleep из системных API Windows. This method calls the Sleep function from the Windows system APIs.

Этот метод не выполняет стандартные конвейеры COM и SendMessage. This method does not perform standard COM and SendMessage pumping.

Если необходимо включить спящий режим в потоке, который имеет STAThreadAttribute, но вы хотите выполнить стандартные выгрузки COM и SendMessage, рассмотрите возможность использования одной из перегруженных версий метода Join, указывающего интервал времени ожидания. If you need to sleep on a thread that has STAThreadAttribute, but you want to perform standard COM and SendMessage pumping, consider using one of the overloads of the Join method that specifies a timeout interval.

Sleep(TimeSpan)

Приостанавливает текущий поток на заданное время. Suspends the current thread for the specified amount of time.

Параметры

Время, на которое приостанавливается поток. The amount of time for which the thread is suspended. Если значение аргумента millisecondsTimeout равно Zero, поток освобождает оставшуюся часть своего интервала времени для любого потока с таким же приоритетом, готовым к выполнению. If the value of the millisecondsTimeout argument is Zero, the thread relinquishes the remainder of its time slice to any thread of equal priority that is ready to run. Если других готовых к выполнению потоков с таким же приоритетом нет, выполнение текущего потока не приостанавливается. If there are no other threads of equal priority that are ready to run, execution of the current thread is not suspended.

Исключения

Значение timeout является отрицательным и не равно Infinite (в миллисекундах) или больше MaxValue миллисекунд. The value of timeout is negative and is not equal to Infinite in milliseconds, or is greater than MaxValue milliseconds.

Примеры

В следующем примере используется перегрузка метода Sleep(TimeSpan) для блокирования основного потока приложения пять раз, в течение двух секунд каждый раз. The following example uses the Sleep(TimeSpan) method overload to block the application’s main thread five times, for two seconds each time.

Комментарии

Выполнение потока не будет запланировано операционной системой на указанный период времени. The thread will not be scheduled for execution by the operating system for the amount of time specified. Этот метод изменяет состояние потока, чтобы оно включало WaitSleepJoin. This method changes the state of the thread to include WaitSleepJoin.

Можно указать Timeout.InfiniteTimeSpan для параметра timeout , чтобы приостановить поток бесконечно. You can specify Timeout.InfiniteTimeSpan for the timeout parameter to suspend the thread indefinitely. Однако рекомендуется использовать другие классы System.Threading, такие как Mutex, Monitor, EventWaitHandle или Semaphore, а также синхронизировать потоки или управлять ресурсами. However, we recommend that you use other System.Threading classes such as Mutex, Monitor, EventWaitHandle, or Semaphore instead to synchronize threads or manage resources.

Эта перегрузка Sleep используется для общего числа целых миллисекунд в timeout . This overload of Sleep uses the total number of whole milliseconds in timeout . Доли миллисекунд отбрасываются. Fractional milliseconds are discarded.

Этот метод не выполняет стандартные конвейеры COM и SendMessage. This method does not perform standard COM and SendMessage pumping.

Если необходимо включить спящий режим в потоке, который имеет STAThreadAttribute, но вы хотите выполнить стандартные выгрузки COM и SendMessage, рассмотрите возможность использования одной из перегруженных версий метода Join, указывающего интервал времени ожидания. If you need to sleep on a thread that has STAThreadAttribute, but you want to perform standard COM and SendMessage pumping, consider using one of the overloads of the Join method that specifies a timeout interval.

Искусство программирования на языке сценариев командной оболочки (42 стр.)

Пример 12-7. Команда date

# Примеры использования команды ‘date’

echo «Количество дней, прошедших с начала года: `date +%j`.»

# Символ ‘+’ обязателен при использовании форматирующего аргумента

# %j, возвращающего количество дней, прошедших с начала года.

echo «Количество секунд, прошедших с 01/01/1970 : `date +%s`.»

# %s количество секунд, прошедших с начала «эпохи UNIX»,

#+ но насколько этот ключ полезен?

suffix=`eval date +%s` # Ключ «+%s» характерен для GNU-версии ‘date’.

# Прекрасный способ получения «уникального» имени для временного файла,

#+ даже лучше, чем с использованием $$.

# Дополнительную информацию вы найдете в ‘man date’.

Ключ -u дает UTC время (Universal Coordinated Time — время по Гринвичу).

bash$ date

Fri Mar 29 21:07:39 MST 2002

bash$ date -u

Sat Mar 30 04:07:42 UTC 2002

zdump

Отображает время для указанной временной зоны.

bash$ zdump EST

EST Tue Sep 18 22:09:22 2001 EST

time

Выводит подробную статистику по исполнению некоторой команды.

time ls -l / даст нечто подобное:

0.00user 0.01system 0:00.05elapsed 16%CPU (0avgtext+0avgdata 0maxresident)k

0inputs+0outputs (149major+27minor)pagefaults 0swaps

См. так же очень похожую команду times, обсуждавшуюся в предыдущем разделе.

Начиная с версии 2.0 Bash, команда time стала зарезервированным словом интерпретатора, с несколько измененным поведением в конвейере.

touch

Утилита устанавливает время последнего обращения/изменения файла в текущее системное время или в заданное время, но так же может использоваться для создания нового пустого файла. Команда touch zzz создаст новый пустой файл с именем zzz, если перед этим файл zzz отсутствовал. Кроме того, такие пустые файлы могут использоваться для индикации, например, времени последнего изменения в проекте.

Илон Маск рекомендует:  Что такое код ncurses_init_color

Эквивалентом команды touch могут служить : >> newfile или >> newfile (для обычных файлов).

at

Команда at — используется для запуска заданий в заданное время. В общих чертах она напоминает crond, однако, at используется для однократного запуска набора команд.

at 2pm January 15 — попросит ввести набор команд, которые необходимо запустить в указанное время. Эти команды должны быть совместимыми со сценариями командной оболочки. Ввод завершается нажатием комбинации клавиш Ctl-D.

Ключ -f или операция перенаправления ввода ( final.list

# затем удаляются повторяющиеся строки,

# и результат записывается в выходной файл.

Ключ -c выводит количество повторяющихся строк.

bash$ cat testfile

Эта строка встречается только один раз.

Эта строка встречается дважды.

Эта строка встречается дважды.

Эта строка встречается трижды.

Эта строка встречается трижды.

Эта строка встречается трижды.

bash$ uniq -c testfile

1 Эта строка встречается только один раз.

2 Эта строка встречается дважды.

3 Эта строка встречается трижды.

bash$ sort testfile | uniq -c | sort -nr

3 Эта строка встречается трижды.

2 Эта строка встречается дважды.

1 Эта строка встречается только один раз.

Команда sort INPUTFILE | uniq -c | sort -nr выводит статистику встречаемости строк в файле INPUTFILE (ключ -nr, в команде sort, означает сортировку в порядке убывания). Этот шаблон может с успехом использоваться при анализе файлов системного журнала, словарей и везде, где необходимо проанализировать лексическую структуру документа.

Как использовать команду Sleep в Linux для приостановки сценария Bash

Главное меню » Операционная система Linux » Как использовать команду Sleep в Linux для приостановки сценария Bash

Команда sleep особенно полезна при использовании в сценарии оболочки bash, например, при повторной попытке сбойной операции или внутри цикла.

В этой статье мы покажем вам, как использовать команду sleep в Linux.

Как использовать команду sleep

Синтаксис команды sleep выглядит следующим образом:

NUMBER – Может быть положительным целым числом или числом с плавающей точкой.

SUFFIX – Может быть одним из следующих:

  • s – секунды (по умолчанию)
  • m – минуты
  • h – часов
  • d – дни

Если суффикс не используется, по умолчанию используются секунды.

Если указано два или более аргументов, общее количество времени эквивалентно сумме их значений.

Вот несколько простых примеров, демонстрирующих использование команды sleep:

Примеры скриптов на Bash

Ниже приведен самый простой пример использования команды sleep в ваших скриптах Bash. Когда вы запустите скрипт, он напечатает текущее время в формате HH:MM:SS. Затем команда sleep приостановит выполнение сценария на 5 секунд. По истечении указанного периода времени последняя строка скрипта снова выведет текущее время.

Вывод будет выглядеть примерно так:

Давайте посмотрим на более сложный пример.

Приведенный выше сценарий будет проверять, находится ли хост в сети или нет, каждые 5 секунд, и когда хост перейдет в режим онлайн, скрипт уведомит вас и остановит.

Как работает скрипт:

  • В первой строке мы создаем бесконечный цикл while.
  • Затем мы используем команду ping, чтобы определить ip_address, доступен ли хост с IP-адресом или нет.
  • Если хост доступен скрипт выполнит echo «Хост находится в сети» и завершает цикл.
  • Если хост недоступен, команда sleep приостанавливает выполнение сценария на 5 секунд, а затем цикл начинается с начала.

Заключение

К настоящему времени вы должны хорошо понимать, как использовать команду sleep в Linux.

Команда sleep – это одна из самых простых команд оболочки, принимающая только один аргумент, который используется для указания интервала ожидания.

Если вы нашли ошибку, пожалуйста, выделите фрагмент текста и нажмите Ctrl+Enter.

Sleep t — приостанавливает выполнение процесса на t секунд

Пример. Бесконечная (циклическая) процедура выводит каждые пять секунд сообщение в указанный файл fil.

Примечание: вместо файла (или экрана) может быть использовано фиктивное устройство /dev/null (например для отладки процедуры).

Примечание: в процедуре реализуется бесконечный цикл. Для ограничения числа циклов надо предусмотреть счетчик циклов (см. выше) или пркратить выполнение процесса процедуры с помощью команды управления процессами — $kill (см. ниже).

exit [n]прекращение выполнения процедуры с кодом завершения [n] или с кодом завершения последней выполненной команды.

В качестве “n” можно использовать любое число, например, для идентификации выхода из сложной процедуры, имеющей несколько причин завершения выполнения.

Тема 26.УПРАВЛЕНИЕ ПРОЦЕССАМИ В UNIX

UNIX — многопользовательская многозадачная операционная система. Концепция процесса является базовой для архитектуры ОС. Процесс строится для каждой прикладной (например sh-процедуры и системной задачи (например — утилиты) с помощью системного вызова fork. Является единицей вычислительной работы и потребления ресурсов. В процессе жизни в системе, процесс непосредственно управляется специальными системными вызовами, которые обеспечивают его построение — передачу управления — завершение:

fork — exec — exit совокупность этих переключений

состояний процесса определяют время

В общем случае активныйпроцесс (выполняемая задача) может находиться в одном из шести состояний (в Linux):

· ожидание процессора в очереди

· выполнение на процессоре в течение выделенного кванта времени

· ожидание освобождения ресурса (например – устройства)

· приостановлен специальным сигналом

· завершился, но его дескриптор еще в оперативной памяти ядра ОС

· процесс свопирован на внешнюю память .

В ОП в активном состоянии находится несколько процессов — до 30000. .Каждому процессу выделяется виртуальная память практически без ограничений (за счет страничной организации).

При выполнении любого вычислительного задания прикладные и системные процессы ядра должны взаимодействовать между собой. Это необходимо для обмена данными, для передачи управляющей информации при использовании системных ресурсов, для синхронизации или управления последовательностью выполнения процессов и т.п.. Для этих целей служат специальные системные программы, встроенные в оболочку и поддерживающие следующие механизмы взаимодействия процессов :

— программы-сокеты — для обмена данными;

— программные каналы для обмена данными между утилитами (см. выше);

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

— семафоры – синхронизация выполнения процессов посредством установки значений бит-«флагов» специальных системных переменных;

— совместно используемая общая область физической памяти.

Перечисленные механизмы использует как сама ОС (write,mail и пр.), так и прикладные программы с помощью команд управления процессами или системных вызоваов.

Роассмотрим создание и работу процессов на примере процедуры. Так как sh-процедура — исполняемый файл то процесс его выполнения обеспечивается в ОС обычными механизмами построения и управления процессами. Для каждой sh-процедуры строится свой процесс со своим дескриптором — порожденный процесс. В дескрипторе процесса хранится информация, необходимая ядру для управления процессом. Дескриторы хранятся в адресном пространствя ядра ОС в виде двунаправленного приоритетного списка, упорядоченного в соответствии с их номерами – идентификаторами процессов (PID).

Рассмотрим как реализуются процессы процедуры примера.

В ответ на приглашение -$ вводится имя процедуры proc и создается порожденный процесс shell. Он вводит данные, необходимые для своего выполнения из указанного файла proc — командные строки. Каждая команда sh-процедуры выполняется порожденным для неё процессом (как обычно для команды, введенной с клавиатуры — процессы утилит). Как только все команды окажутся выполненными, sh-процесс завершается и управление возвращается родительскому процессу. Процедура выполнена.

Планировщик обрабатывает процессы двух видов – обычные и более приоритетные процессы реального времени. Место в очереди определяется его приоритетом.

Процессы выполняются в одном из двух режимов- пользовательском и в режиме ядра. В режиме ядра выполняются процессы системных вызовов. В этом случае они имеют доступ к процедурам и структурам данных ядра. Такая организация позволяет ядру защитить свои процедуры и структуры системных данных от искажений со стороны проблемных задач.

Дескрипторы процессов создаются и удаляются динамически при выполнении процессов. Поэтому состав и размер списка постоянно меняются. Так как все процессы связаны между собой родственными отношениями, то списковая организация процессов используется для процессов одного ранга (например – для всех порожденных одним родительским или для всехродительских и т.п.). Таким образом вся система дескрипторов представляет собой некоторую древовидную структуру с коренным общисистемным процессом (swapper – имеющего идентификатор P >

Процессор выделяется каждому процессу в очереди на ограниченные кванты времени. Это принципиально отличает многозадачный режим обработки заданий в UNIX от однозадачного режима (DOS), где процессор выделяется процессам строго последовательно на все время выполнения процесса. В UNIX пересчет приоритетов происходит постоянно по прерываниям определенного типа с частотой — около одного раза в сек.

Часть инфориации дескриптора может быть выведена в листинг характеристик процесса с помощью специальной команды ps (см. ниже). Некоторые заголовки полей листинга:

— номер терминала, которому принадлежит процесс (TTY)

— использованное время процессора (TIME)

— идентификатор процесса (PID)

— имя программы процесса или команды, выполняемой в теле процедуры на момент запроса листинга (CMD)

— идентификатор родительского процесса (PPID)

— адрес процесса (ADDR)

— величина изменения значения приоритета (NI) и пр..

Полную информацию о процессе пользователь или администратор может получить с помощью этой команды в следующем формате:

$ps [-k] [ ] — вывод листинга

характеристик процесса.

Некоторые значения ключей:

— -a[l] показать процессы данного терминала или

— -af полный (достаточный_ формат сообщения

— -afl длинный формат

— -u показать все активные процессы и пр..

PID PPID TTY PRI TIME CMD

927 1 tty5 0:04 sh

1001 927 tty5 0:02 ps

Для вывода листинга процессов, принадлежащих пользователю можно воспользоваться конструкцией:

Тема 27.СОЗДАНИЕ ФОНОВЫХ ПРОЦЕССОВ

При обычном запуске с терминала некоторой программы на исполнение (системной утилиты или прикладной задачи) интерпретатором shell создается привилегированный процесс, который все время связан со своим терминалом. Запуск следующего процесса может быть выполнен пользователем только после завершения текущего, т.е. при появлении приглашения ‘$’ от интерпретатора.

В целях использования возможности параллельного выполнения программ в ОС UNIX отдельные задачи или задания пакетного режима могут быть запущены одновременно с заданиями диалогового режима.Для запуска фонового (параллельного с другими потомками) процесса в командную строку необходимо и достаточно последним символом добавить знак

& (амперсанд):

Илон Маск рекомендует:  Директивы препроцессора

Shell выводит номер этого процесса (PID) и разрешает ввод

Фоновые процессы обладают некоторыми недостатками:

— не допускают ввода с клавиатуры;

-обеспечивают вывод на экран, но при этом нарушают целостность вывода диалогового процесса.

Общепринятый прием исключения влияния фонового вывода на интерактивную работу:

ком_строка>имя_файла.out &

— ком_строка планирует задание для фонового режима

— перенаправляет вывод вместо экрана в указанный файл головного каталога пользователя.

$grep ааа* > grep.out &

PID TTY TIME CMD

194 tty5 0:02 grep

200 tty5 0:01 ps

Особенности работы с фоновым режимом:

— выполняемая в фоновым режиме программа (команда), требующая стандартного ввода, должна читать его из файла с использованием перенаправленного ввода;

— программа, выполняемая в фоновом режиме не может быть прервана , т.к. она отсоединяется от клавиатуры и м.б. прекращена только с помощью команды kill или выходом из системы;

— выход из системы exit надо выполнять два раза: для завершения фонового процесса и завершения основного процесса shell.

В случаях, когда фоновый процесс все же требует ввода данных с клавиатуры, то его надо временно перевести в оперативный режим, ввести данные, и вернуть опять в фоновый с помощью следующих команд:

fg %N — перевод фонового процесса в оперативный;

bg %N — перевод оперативного в фоновый режим.

Здесь N – порядковый номер фонового задания, которое в общем случае может содержать несколько активных процессов и все они переводятся в соответствующий режим.

Номер задания “N” выводится:

при запуске фоновой программы

командой jobs без приостановленя или с приостановлением фонового процесса.

Приостановить выполнение процесса с выходом в shell (например для анализа состояния и результатов работы процедуры) можно с помощью прерывания-

с последующим запуском приостановленного процесса.

$inf>f.out& — запуск процедуры inf в фоновом режиме

[1] 1754 — номер задания и идентификатор процесса

%1 — номер задания

$bg %1 — запуск на продолжение в фоновом режиме

Выполнение фоновых заданий прекращается с выходом пользователя из системы. НО! Если фоновая программа должна быть продолжена и после прекращения текущего сеанса работы, то необходимо использовать команду:

$nohup имя_фоновой_программы & команда запускает и защищает фоновую программу от прерываний, вырабатываемых при выходе пользователя из системы, а также 2) перенаправляетфоновый протокол в системный файл nohup.out.

Вместе с тем, вывод протокола работы фоновой программы можно перенаправить в специальный файл, который просмотреть позже без нарушения протокола работы с оперативной задачей:

$nohup имя_фон_программы>имя_файла&

Рассмотрим два случая применения команды nohup.

Первый пример, где nohup перенаправляет протокол в указангный файл :

$nohup cat * > outfile &

$exit — завершается работа оперативного процесса

Повторный вход в систему:

$ps -af|grep cat — конвеер, выделяется строка с шаблоном cat

UID PID PPID CMD

lev 972 1 cat *>outfile &

В примере «процесс идет», nohup становится самостоятельным процессом и его PP общесистемным процессом init и его выполнение будет продолжаться.

Примечание: в поле CMD может не указываться имя процедуры, а выводиться имя текущей утилиты этой процедуры, дентифицировать процедуру лучше по PID.

Если перенаправление протокола не использовать, то вывод автоматически осуществляется в систеный файл nohup.out, создаваемый системой в головном каталоге пользователя HOME.

$nohup find / -user lev -type f &

$cd — переход в HOME

Команда nohup позволяет таким образом предупредить вывод на экран протокола фонового задания с прерыванием протокола работы оперативного процесса.

Пример: в чем разница в выполнении командных строк?

$PR;pr2;pr3 & — в фоновом режиме выполняется только pr3

$(PR1;pr2;pr3) & — в фоновом режиме выполняются все программы (подстановка опции & перед выполнением каждой программы из списка).

Тема 28.УПРАВЛЕНИЕ ПРИОРИТЕТАМИ

Максимальный приоритет процессов каждого пользователя группы устанавливает администратор. Если при выполнении задания образуются несколько порожденных процессов, то все они имеют одинаковый приоритет равный родительскому. В этом случае все процессы получают ресурсы равными долями (простой режим разделения времени). При необходимости выделения наиболее важных родительских процессов порожденным второстепенным можно понизить приоритет с помощью команды:

nice [-k] имя_программы выполнениепрограммы,указанной

usleep

(PHP 4, PHP 5, PHP 7)

usleep — Задержка выполнения в микросекундах

Описание

Откладывает выполнение программы на указанное число микросекунд.

Список параметров

Время откладываемого исполнения в микросекундах. Микросекунда — это одна миллионная секунды.

Возвращаемые значения

Эта функция не возвращает значения после выполнения.

Примеры

Пример #1 Пример использования usleep()

// Текущее время
echo date ( ‘h:i:s’ ) . «\n» ;

// ждать 2 секунды
usleep ( 2000000 );

// вернуться к исполнению
echo date ( ‘h:i:s’ ) . «\n» ;

Результат выполнения данного примера:

Смотрите также

  • sleep() — Задержка выполнения
  • time_nanosleep() — Задержка на заданное число секунд и наносекунд
  • time_sleep_until() — Откладывает исполнение скрипта до заданного времени
  • set_time_limit() — Ограничение времени выполнения скрипта

User Contributed Notes 12 notes

the snippet below by ‘Marius (mm at co-operation dot de)’ is NOT a usleep and it will keep the CPU at 100% running. why people keep posting that crap is a complete mystery for me.

the idea of sleep and usleep is that by letting the cpu run a few idle cycles so the other programs can have some cycles run of their own. what results in better response times and lower overall system-load. so if you have to wait for something, go to sleep for a few seconds instead of occupying the cpu while doing absolute nothing but waitting.

On both MacOS X and Linux the usleep() call seems to consume CPU cycles, whereas sleep() and time_nanosleep() do not. This was the same on PHP 5.3.29 and 5.5.29.

I used a loop with just a call to sleep/usleep/time_nanosleep, and compared them all with an empty loop. Obviously the empty loop consumed 99% of the CPU, sleep used 0%, usleep used 3% for 1000ms and 6% for 100ms, and time_nanosleep used 0% for both 500ms and 1000ms.

If you’re using Windows then you maybe are in trouble with usleep if you really need to use it.

The Bernie’s microdelay function using fsockopen does not work properly, and the fclose doesn’t help much.

I don’t know if network connections go strange, but I know it does not work since you’ve made more than 2000 — 3000 calls to it, so it’s not a reliable solution in ‘long life’ php scripts, or these are the issues of the microdelay function in my PHP and PHP-GTK applications.

Though another solution should be found, and googling a bit I fount a WinAPI function: Sleep.

So I get with this snippet wich works fine for me, you get milliseconds precission but the more important, it works for long-run scripts and of course, it does not waste any CPU cycles.

// USleep alternative for Windows and PHP4:
$GLOBALS[‘win32api’]->registerfunction(«long Sleep (long dwMillisecods) From kernel32.dll»);

// Now you can call the function from everywhere in your script: $GLOBALS[‘win32api’]->Sleep(milliseconds);

for ($msec = 2000; $msec > 0; $msec = $msec — 125) <
echo «Hi. Next one in $msec msec.\n»;
$GLOBALS[‘win32api’]->Sleep($msec);
>

Note that this function has an overhead!

Example:
for ( $i = 0 ; $i 1000000 ; ++ $i )
<
usleep ( 1 );
>
?>

This block is running about 70 seconds on my server.
Script take about 70 microseconds for every usleep() function call.

To monitor a scripts CPU ussage and avoid any nasty CPU gobbling loops you can use this function (will not work with windows or safe mode) I know it works on FreeBSD:
function phpmon($max)
<
$cmd = `ps -Unobody -r -o%cpu`;
$lines = explode(«\n», $cmd);
$usage = substr($lines[1], 0, strpos($lines[1], «.»));
$sleeprate = 500;
while ($usage >= $max)
<
$cmd = `ps -Unobody -r -o%cpu`;
$lines = explode(«\n», $cmd);
$usage = substr($lines[1], 0, strpos($lines[1], «.»));
usleep($sleeprate);
>
>

where $MAX is the maximum CPU you want the process to consume. e-mail me with any improvements/suggestions.

I have noticed that this consumes a lot of system CPU (at least in my limited testing) possibly from all of the system calls or the huge mathematical functions I used to test the effectiveness of the script.

I have spent DAYS trying to create a reliable usleep()-replacement for Windows.

I have only this to offer:

As commented by someone else already, the gettimeofday() method used below is useless — PHP will use all available CPU power doing nothing.

The fsockopen() method apparently is also useless — as someone else commented, an fclose() was missing in the original post, but this apparently does not solve the problem. After calling the function about 50 or so times, fsockopen() returns immidiately, without any delay — and watching a process monitor in Windows, you can then watch the process taking up increasingly more memory, until eventually PHP aborts (or crashes) when it reaches maximum.

The win32api-method is also a no-go . after calling the Sleep function a few hundred times (during which memory usage will also go up every time due to a memory leak somewhere), PHP will cause an exception and Windows will terminate it.

I have given up — I don’t think there is any viable solution to this problem under PHP 4.

If you need this function, upgrade your project to PHP 5.

Or settle for 1-second delays with the sleep()-function.

These, unfortunately, seem to be your only options.

Dude you are SO the man for that code snippet. It worked like a charm. I just wanted to point out a couple things and offer my own improvement.

1. If you’re like me, you were probably wondering why the socket had to keep being recreated on each call, and why you couldn’t just create a static socket. Its because socket_select assumes you’re passing in a pointer, and will alter the variable on return to reflect the actual sockets that were changed.

2. I couldn’t figure out for the life of me why socket_select wasn’t defined. Its because you hadn’t enabled the right extension in php.ini

Илон Маск рекомендует:  headers_sent - Проверяет, отправлены ли HTTP заголовки

Ok so heres my slight improvement. The only real thing I did is use a static variable for the socket, to avoid creating a brand new socket on each call of this function. I’m not sure if socket creation will cause things to crash down the line like the other problems reported on here, but if you ask me better safe then sorry.

function Sleeper($mSec)
<
// For dummies like me who spent 5 minutes
// wondering why socket_create wasn’t defined
if(!function_exists(‘socket_create’)) <
die(«Please enable extension php_sockets.dll»);
>

// So the socket is only created once
static $socket=false;
if($socket===false) <
$socket=array(socket_create(AF_INET,SOCK_RAW,0));
>
$pSock=$socket;

// Calc time
$uSex = $mSec * 1000;

// Do the waiting
socket_select($read=NULL,$write=NULL,$pSock,0,$uSex);

Windows: Sleep(0.5)

Как, наверняка, многие знают, в WinAPI’шную функцию Sleep передаётся число миллисекунд, на сколько мы хотим уснуть. Поэтому минимум, что мы можем запросить — это уснуть на 1 миллисекунду. Но что если мы хотим спать ещё меньше? Для интересующихся, как это сделать в картинках, добро пожаловать, под кат.

Сперва напомню, что виндоус (как любая не система реального времени) не гарантирует, что поток (некоторые называют его нить, thread) будет спать именно запрошенное время. Начиная с Висты логика ОС простая. Есть некий квант времени, выделяемый потоку на выполнение (да, да, те самые 20 мс, про которые все слышали во времена 2000/XP и до сих пор слышат про это на серверных осях). И виндоус перепланирует потоки (останавливает одни потоки, запускает другие) только по истечению этого кванта. Т.е. если квант в ОС стоит в 20 мс (по умолчанию в XP было именно такое значение, например), то даже если мы запросили Sleep(1) то в худшем случае управление нам вернётся через те же самые 20 мс. Для управления этим квантом временем есть мультимедийные функции, в частности timeBeginPeriod/timeEndPeriod.

Во вторых, сделаю краткое отступление, зачем может потребоваться такая точность. Майкрософт говорит, что такая точность нужна только мультимедийным приложениям. Например, делаете вы новый WinAMP с блекджетом, и здесь очень важно, чтобы мы новый кусок аудио-данных отправляли в систему вовремя. У меня нужда была в другой области. Был у нас декомпрессор H264 потока. И был он на ffmpeg’е. И обладал он синхронным интерфейсом (Frame* decompressor.Decompress(Frame* compressedFrame)). И всё было хорошо, пока не прикрутили декомпрессию на интеловских чипах в процессорах. В силу уже не помню каких причин работать с ним пришлось не через родное интеловское Media SDK, а через DXVA2 интерфейс. А оно асинхронное. Так что пришлось работать так:

  • Копируем данные в видеопамять
  • Делаем Sleep, чтобы кадр успел расжаться
  • Опрашиваем, завершилась ли декомпрессия, и если да, то забираем расжатый кадр из видеопамяти

Проблема оказалась во втором пункте. Если верить GPUView, то кадры успевали расжиматься за 50-200 микросекунд. Если поставить Sleep(1) то на core i5 можно расжать максимум 1000*4*(ядра) = 4000 кадров в секунду. Если считать обычный fps равным 25, то это выходит всего 40 * 4 = 160 видеопотоков одновременно декомпрессировать. А цель стояла вытянуть 200. Собственно было 2 варианта: либо переделывать всё на асинхронную работу с аппаратным декомпрессором, либо уменьшать время Sleep’а.

Первые замеры

Чтобы грубо оценить текущий квант времени выполнения потока, напишем простую программу:

Сразу, хочу предупредить, что если у вас например MSVS 2012, то std::chrono::high_resolution_clock вы ничего не намеряете. Да и вообще, вспоминаем, что самый верный способ измерить длительность чего либо — это Performance Counter’ы. Перепишем немного наш код, чтобы быть уверенными, что меряем времена мы правильно. Для начала напишем классец-хелпер. Я тесты сейчас делал на MSVS2015, там реализация high_resolution_clock уже правильная, через performance counter’ы. Делаю этот шаг, вдруг кто захочет повторить тесты на более старом компиляторе

Временная задержка в C. usleep

Я разрабатываю игровой сервер, который написан на C. И мне нужно разработать цикл с определенной частотой (50 раз в секунду) для выполнения алгоритма. Проблема в том, что я не могу приостановить программу на точный временной интервал — 20000 микросекунд. Функция usleep(20000) работает около 30000 микросекунд. Результат всегда больше на 10000 микросекунд, чем ожидалось.

Вот мой простой пример кода:

И результат его выполнения:

Я также попытался использовать функцию select() , но результат будет таким же, как с sleep() .

Объясните мне, пожалуйста, что не так с моим кодом.

Вместо того, чтобы спать в течение 20000 секунд, спать на время, оставшееся до повторного запуска, на основе вызова clock_gettime

Это не то, что у вашего кода есть проблема, но фактический вызов спать, чтение времени и т.д. требует времени, и система не может спать в течение точного времени в любом случае, если это не кратно его точным часам цикл

Спящие функции в системах, отличных от реального времени, не гарантируют спящий точный период; на занятой системе процесс будет разбужен только тогда, когда начнется его срез времени. Или как показывает страница man, «активность системы может продлить время ожидания на неопределенное количество».

Значение, близкое к 10 мс, как частота kern.hz опускается до 100, как некоторые рекомендуют для настроек VM.

Классическим обходным решением для этой проблемы является тот, который предлагается Офиром: вместо указания фиксированного интервала сна укажите оставшееся время для сна. В среднем ваш цикл будет выполняться каждые 20 мс, чего вы, скорее всего, захотите достичь.

C ++ Хотя цикл, usleep () / sleep (), как не использовать 90% процессорного времени? (Ubuntu 12.04)

Предположим, у меня есть код C ++, такой как

Программа будет работать нормально и будет делать то, что должна, но она будет использовать более 90% моего процессора.

Мне было предложено использовать usleep () в моем цикле while каждые 100 мс или около того, так как я все равно забочусь о том, чтобы делать что-то каждые 500 мс. Таким образом, он загружает процессор, когда его не нужно.

Так что я добавил его в свой цикл

Он хорошо компилируется, но когда я его запускаю, программа зависает прямо во время сна и никогда не возвращается. Я где-то читал, что перед вызовом usleep необходимо очистить все буферы, поэтому я сбросил все файловые потоки, каты и т. Д. И т. Д. Все еще не повезло.

Я искал решение в течение 2 дней. Я тоже использовал sleep () без удачи.

Я нашел несколько альтернатив, но они кажутся сложными и добавят в мою программу много кода, который я не совсем понимаю, что усложнит его и сделает его беспорядочным, плюс он может не работать.

Я никогда не задумывался о циклах while () раньше, потому что большинство написанных мною программ предназначались для микроконтроллеров или FPGA, и это не проблема для загрузки процессора.

Если кто-то может помочь …. любые ресурсы, ссылки, книги? Благодарю.

Решение

Ваш подход несколько исходит из неправильного конца. Программа должен потреблять 90-100% ЦП до тех пор, пока у него есть что-то полезное (в противном случае он должен блокироваться, потребляя нулевой ЦП).
Сон между ними приведет к тому, что выполнение будет длиться дольше без веской причины, и потреблять больше энергии, чем просто выполнять работу как можно быстрее (при 100% ЦП), а затем полностью блокироваться, пока не будет доступно больше работы или до какой-либо другой важной вещи (например, половины Прошла секунда, если это важно для вас).

Имея это в виду, структурируйте вашу программу концептуально:

Кроме того, не спите во время выполнения, но используйте таймеры (например, setitimer ) делать что-то через равные промежутки времени. Это будет не только более эффективным, но и намного более точным и надежным.

То, как именно вы это реализуете, зависит от того, насколько переносимым должно быть ваше программное обеспечение. В Ubuntu / Linux вы можете, например, использовать такие API, как epoll_wait с eventfd вместо того, чтобы писать обработчик сигнала для таймера.

Другие решения

Этот код работает, как и ожидалось для меня (хотя работает на OSX).

Есть логическая проблема или, может быть, вы делаете несколько счетчиков? Поскольку вы сказали, что создали микроконтроллеры, я предполагаю, что вы пытаетесь использовать тактовые циклы в качестве метода подсчета при вызове системных таймеров? Кроме того, что вызывает у меня сомнения, если вам рекомендуется использовать usleep (x), почему вы используете double в течение миллисекунды? usleep (1) составляет 1 микросекунду == 1000 миллисекунд. Sleep (x) — это счетчик в x секунд, поэтому система приостанавливает текущее задание на x секунд.

Если вы хотите использовать 500 мс, замените usleep (SECOND) на usleep (500 * MILLISECOND).
Я предлагаю вам использовать отладчик и пройтись по своему коду, чтобы увидеть, что происходит.

Лучший способ выполнить функцию на заданной временной частоте (таймер)?

У меня есть небольшая программа, которая должна запускаться в небольшой встроенной системе Linux (ARM). Он написан на C. Он должен опросить некоторые данные (2×64-бит) из API, предоставленные производителем системы, а затем выполнить некоторые вычисления и отправить данные через сеть. Данные должны быть опрошены примерно 30 раз в секунду (30 Гц).

Каким будет лучший способ сделать это в C? Я видел решения, использующие sleep() , но это не лучший вариант для работы.

c linux timer embedded-linux

2 ответа

Предлагаю рассмотреть возможность использования опроса poll (2), чтобы выполнить опрос.

обратите внимание, что когда poll ждет и опрос для ввода, он не потребляет никакого CPU

Если обработка каждого события занимает некоторое значительное время (например, миллисекунда или более), вы можете захотеть пересчитать задержку.

Вы можете использовать timerfd_create (2) (и дать как ваш файловый дескриптор вашего устройства, так и ваш таймер fd для опроса). См. Также timer_create (2).

Возможно, clock_gettime (2) может быть полезным.

И чтение time (7) определенно полезно. Возможно, также Advanced Linux Programming.

2 Yu Hao [2013-10-07 17:40:00]

sleep() приостанавливает выполнение в секундах, если вы ищете более точную функцию sleep(), используйте usleep() , которая приостанавливает выполнение в микросекундах или nanosleep() в наносекундах.

Понравилась статья? Поделиться с друзьями:
Кодинг, CSS и SQL