#c #linux #linux-kernel #system-calls
#c #linux #linux-ядро #системные вызовы
Вопрос:
Какая из двух функций лучше
#include <time.h>
int clock_nanosleep(clockid_t clock_id, int flags, const struct timespec *rqtp, struct timespec *rmtp);
или
#include <time.h>
int nanosleep(const struct timespec *rqtp, struct timespec *rmtp);
Комментарии:
1. Определите «хорошо». Портативный, эффективный, хорошо известный, понятный, точный, что, что, что?
2. Вы читали справочные страницы? linux.die.net/man/3/clock_nanosleep
3. @SanJacinto никто не читает справочные страницы. Это все равно, что я спрашиваю вас: «Вы читали условия обслуживания Facebook» или механик спрашивает вас: «Вы хотя бы читали руководство пользователя», когда вы не можете понять, почему ваши дальние лучи не будут работать = P
Ответ №1:
Преимущества clock_nanosleep
over nanosleep
заключаются в:
- Вы можете указать абсолютное время ожидания до, а не интервал для сна. Это имеет значение для часов реального времени (настенного времени), Которые могут быть сброшены администратором или
ntpd
и т. Д. Сnanosleep
предварительным вычислением интервала ожидания для достижения заданного абсолютного времени вы не сможете проснуться, если часы будут сброшены и желаемое время наступит «рано». Кроме того, существует условие гонки с планированием с использованием интервалов времени: Если вы вычисляете интервал, который хотите перевести в режим сна, но перед вызовом вас прерываютnanosleep
и какое-то время не назначают, вы снова будете спать слишком долго. - Вы можете спать с таймерами, отличными от часов реального времени. Наиболее полезным обычно является монотонный тактовый режим (который нельзя сбросить и монотонно увеличивается с течением фактического времени), но есть и другие интересные приложения, например, наличие одного потока в многопоточном процессе в режиме ожидания на часах процессорного времени процесса (поэтому он просыпается после того, как процесс использовалзаданное количество процессорного времени).
Комментарии:
1. Просто хотел добавить комментарий, чтобы избежать путаницы … nanosleep() в Linux использует CLOCK_MONOTONIC clock . Итак, если вы хотите использовать часы, отличные от CLOCK_MONOTONIC в Linux, именно тогда вам понадобится clock_nanosleep() .
2. @It’Spete: для спящих с относительным временем разве они не одинаковы?
Ответ №2:
В моей системе man 2 clock_nanosleep
объясняет различия между двумя функциями таким образом:
Как и nanosleep(2), clock_nanosleep() позволяет вызывающему абоненту спать в течение интервала, указанного с точностью до наносекунды. Он отличается тем, что позволяет вызывающей стороне выбирать часы, по которым должен быть измерен интервал ожидания, и позволяет указывать интервал ожидания либо как абсолютное, либо как относительное значение. Аргумент clock_id [...] может иметь одно из следующих значений: CLOCK_REALTIME Настраиваемые общесистемные часы реального времени. CLOCK_MONOTONIC неустановляемый, монотонно увеличивающийся тактовый сигнал, который измеряет время с некоторого неопределенного момента в прошлом , который не изменяется после запуска системы. CLOCK_PROCESS_CPUTIME_ID Настраиваемые часы для каждого процесса, которые измеряют время процессора , потребляемое всеми потоками в процессе.
Комментарии:
1. Спасибо… Я использую стандартную lib-функцию posix precision sleep для перехода в спящий режим, но, похоже, она возвращается слишком быстро. Пожалуйста, изучите этот код и предоставьте подробную информацию о способе восстановления функции для корректного ожидания нужного количества времени.