CLOCK_MONOTONIC, как следует из «монотонного» имени, никогда не уходит в прошлое, оно всегда растет. Не изменится, если пользователь или другой процесс (например, NTP) изменят «настенные» часы на машине.
CLOCK_MONOTONIC - правильная шкала времени для использования в таймерах. Это может в конечном итоге перевернуться, но даже с этим можно обращаться аккуратно, если вы делаете это осторожно. Используйте переменную того же типа для внутреннего таймера.
Например, следующий код будет работать накануне, если часы будут вращаться.
Примечание: kDelayInterval должен быть меньше, чем период обтекания (обычно это не проблема).
struct timespec current_time;
struct timespec last_update = {0,0};
.
.
clock_gettime(CLOCK_MONOTONIC, ¤t_time);
if((current_time.tv_sec - last_update.tv_sec) > kDelayInterval)
{
.
.
.
clock_gettime(CLOCK_MONOTONIC, &last_update);
}