2009-10-24 3 views
10

struct timeval представляет и мгновенное время с двумя членами, tv_sec (секунды) и tv_usec (микросекунды). В этом представлении tv_usec само по себе не является абсолютным временем, это вспомогательное смещение от tv_sec.Есть ли стандартный способ преобразования struct timeval в struct timespec?

struct timespec работает одинаково, за исключением того, что вместо микросекунд его смещение (tv_nsec) хранится в наносекундах.

Вопрос: Есть ли стандартный способ преобразования между этими двумя?

ответ

13

Глядя на this doc, я бы подумал, что умножение tv_usec на 1000 достаточно, чтобы получить tv_nsec.

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

+0

Поскольку tv_nsec является подгруппой второго смещения, а что если умножение на 1000 приводит к значению, превышающему 1 миллиард ... Разве вам не нужно было бы добавить 1 к tv_sec, а затем установить tv_nsec на сумму более 1 миллиарда? – dicroce

+9

Нет, потому что 'tv_usec', будучи смещением в микросекундах, гарантированно будет меньше 1 миллиона, поэтому умножение на 1000 дает значение менее 1 миллиарда. – JaakkoK

+1

И если вы хотите перейти от timepec к timeval, вы разделите 'tv_nsec' на 1000, чтобы получить' tv_usec' (возможно, сначала добавьте 500, чтобы округлить). – 2015-10-26 02:39:10

11

В sys/time.h есть два макроса, которые, что вы хотите:

TIMEVAL_TO_TIMESPEC(X, Y) 

и

TIMESPEC_TO_TIMEVAL(X, Y) 

Посмотреть документы здесь: http://www.daemon-systems.org/man/TIMEVAL_TO_TIMESPEC.3.html

+0

В Linux вам может понадобиться определить '_GNU_SOURCE' перед' #include ', чтобы получить эти макросы. –

Смежные вопросы