Причина в том, что вы (неявно) используете разные системные часы. timespec_get()
использует системные часы реального времени высокого разрешения, а time()
использует грубые часы реального времени.
Попробуйте использовать
clock_gettime(CLOCK_REALTIME_COARSE, &ts);
вместо вашего timespec_get()
, тогда разница должна исчезнуть sh.
Редактировать:
Это можно увидеть в Linux Kernel Source, vclock_gettime. c
На самом деле проблема здесь немного тонкая, чтобы ее увидеть. Секундная часть элементов структуры, используемая CLOCK_REALTIME_COARSE
и CLOCK_REALTIME
, содержит идентичные значения, но часть наносекунд отличается; с CLOCK_REALTIME
оно может быть больше 1000000000
(что составляет одну секунду). В этом случае он фиксируется на вызове:
ts->tv_sec += __iter_div_u64_rem(ns, NSEC_PER_SEC, &ns);
ts->tv_nsec = ns;
Эта коррекция не выполняется ни с CLOCK_REALTIME_COARSE
, ни с time()
. Это объясняет разницу между CLOCK_REALTIME
и time()
.