Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: gettimeofday  (Прочитано 45769 раз)
0 Пользователей и 1 Гость смотрят эту тему.
Sava
Участник

by
Offline Offline

« : 04-03-2009 10:16 » 

кто-нибудь знает точность с которой вычисляет время эта функция. До одной миллисекунды или как? подскажите, пожалуйста. нигде не могу найти
Записан
RXL
Технический
Администратор

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #1 : 04-03-2009 12:42 » 

http://www.opennet.ru/man.shtml?topic=gettimeofday&category=2&russian=0

Цитата
Код: (C)
#include <sys/time.h>

int gettimeofday(struct timeval *tv, struct timezone *tz);
int settimeofday(const struct timeval *tv , const struct timezone *tz);  

Код: (C)
struct timeval
{
    long    tv_sec;         /* секунды */
    long    tv_usec;        /* микросекунды */
};
« Последнее редактирование: 04-03-2009 12:44 от RXL » Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
Finch
Спокойный
Администратор

il
Offline Offline
Пол: Мужской
Пролетал мимо


« Ответ #2 : 04-03-2009 12:43 » 

Плохо ишем. Первая же ссылка гугла http://www.delorie.com/djgpp/doc/libc/libc_421.html
Записан

Не будите спашяго дракона.
             Джаффар (Коша)
Вад
Модератор

ru
Offline Offline
Пол: Мужской

« Ответ #3 : 04-03-2009 12:46 » 

Значение-то функция выдаст в микросекундах. А с какой точностью - это уже от точности системного таймера зависит. Далеко не факт, что он каждую микросекунду обновляется. Обычно такие счётчики имеют точность в 20-50 микросекунд, если не ошибаюсь.
Записан
Sla
Команда клуба

ua
Offline Offline
Пол: Мужской

WWW
« Ответ #4 : 04-03-2009 12:56 » 

в PC, если ничего не далать - 1/18 сек
Записан

Мы все учились понемногу... Чему-нибудь и как-нибудь.
RXL
Технический
Администратор

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #5 : 04-03-2009 13:20 » 

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

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
Антон (LogRus)
Глобальный модератор

ru
Offline Offline
Пол: Мужской
Внимание! Люблю сахар в кубиках!


WWW
« Ответ #6 : 04-03-2009 16:39 » 

Думаю на некоторые вопросы ответит статья http://rus-linux.net/MyLDP/BOOKS/ldd2/6/ldd2_ch6.html
От себя хочу сказать, что частота прерываний ядра настраивается как минимум при компиляции ядра, насколько я помню для серваков рекомендуют 100(чего-то) для десктопных машин рекомендуют 1000 (чего-то) Улыбаюсь

кстати, вопрос который надо было задать с самого начала: а нафига такие нюансы? Улыбаюсь
Записан

Странно всё это....
McZim
Команда клуба

ru
Offline Offline
Пол: Мужской
Я странный


WWW
« Ответ #7 : 04-03-2009 20:01 » 

LogRus, не на самом деле по умолчанию, хоть сервер хоть десктоп прерывания одинаковы 250, а там уж кто на что горазд
Записан

The CBO without stats is like a morning without coffee. (c) T.Kyte.
Антон (LogRus)
Глобальный модератор

ru
Offline Offline
Пол: Мужской
Внимание! Люблю сахар в кубиках!


WWW
« Ответ #8 : 05-03-2009 05:47 » 

McZim, может быть, я давно ядро не компилировал Улыбаюсь но помню что были рекомендации
Записан

Странно всё это....
RXL
Технический
Администратор

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #9 : 05-03-2009 19:16 » 

Я в ядре не ковырялся давно - с 2.4. Там не было никакого выбора - константы были прописаны в заголовках asm/<platform> и значение для i386 было 100 Гц.
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
Serg79
Команда клуба

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #10 : 05-03-2009 22:15 » 

Я в ядре не ковырялся давно - с 2.4. Там не было никакого выбора - константы были прописаны в заголовках asm/<platform> и значение для i386 было 100 Гц.
В ядре 2.6.* стало возможным выбирать частоту таймера.
Примерно так сейчас это выглядит  Улыбаюсь
Код:
.config - Linux Kernel v2.6.27.19 Configuration
 ──────────────────────────────────────────────────────────────────────────────


     ┌───────────────────────── Timer frequency ──────────────────────────┐
     │  Use the arrow keys to navigate this window or press the hotkey of │
     │  the item you wish to select followed by the <SPACE BAR>. Press    │
     │  <?> for additional information about this option.                 │
     │ ┌────────────────────────────────────────────────────────────────┐ │
     │ │                          (X) 100 HZ                            │ │
     │ │                          ( ) 250 HZ                            │ │
     │ │                          ( ) 300 HZ                            │ │
     │ │                          ( ) 1000 HZ                           │ │
     │ │                                                                │ │
     │ │                                                                │ │
     │ └────────────────────────────────────────────────────────────────┘ │
     ├────────────────────────────────────────────────────────────────────┤
     │                       <Select>      < Help >                       │
     └────────────────────────────────────────────────────────────────────┘
Записан
ffobos
Интересующийся

ru
Offline Offline

« Ответ #11 : 17-01-2011 04:20 » 

помогите наченающему программеру немогу вытащить системное время перебрал все функции которые относятся к time.h при компиляции выдает ошибку             /usr/lib/gcc/i486-linux-gnu/4.4.3/../../../../lib/crt1.o: In function `_start':
                                                                 (.text+0x18): undefined reference to `main'
при вызове функции timeval bits/types.h выдает ошибку    /tmp/ccyvq2iG.o: In function `clocks':
                                                                                                            asd.c:(.text+0xd): undefined reference to `timeval'
                                                                                                             collect2: ld returned 1 exit status
есть-ли зависимость от дистрибюдива? я работаю в UBUNTU.
Записан
Sava
Участник

by
Offline Offline

« Ответ #12 : 17-01-2011 08:54 » 

a попробуйте при компиляции указывать параметр -lrt (вроде так, счас еще поищу)
Записан
Антон (LogRus)
Глобальный модератор

ru
Offline Offline
Пол: Мужской
Внимание! Люблю сахар в кубиках!


WWW
« Ответ #13 : 17-01-2011 09:58 » 

[XXXXXX@XXXX~]$ man localtime
NAME
     asctime, asctime_r, ctime, ctime_r, difftime, gmtime, gmtime_r,
     localtime, localtime_r, mktime, timegm -- transform binary date and time
     values

LIBRARY
     Standard C Library (libc, -lc)

обрати внимание на блок LIBRARY
линковщику надо сказать, что бы он подключил libc для это пишешь в параметрах -lc , т.е. для подключение библиотеки нужно указать -l и имя библиотеки опустив префикс lib
Записан

Странно всё это....
npak
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #14 : 17-01-2011 13:03 » 

обрати внимание на блок LIBRARY
линковщику надо сказать, что бы он подключил libc для это пишешь в параметрах -lc , т.е. для подключение библиотеки нужно указать -l и имя библиотеки опустив префикс lib

По умолчанию в нормально настроенном gcc libc подцепляется "автоматом". Явно указывать её не требуется.

ffobos, покажи командную строку gcc или Makefile
Записан

UniTesK -- индустриальная технология надежного тестирования.

http://www.unitesk.com/ru/
Антон (LogRus)
Глобальный модератор

ru
Offline Offline
Пол: Мужской
Внимание! Люблю сахар в кубиках!


WWW
« Ответ #15 : 18-01-2011 04:34 » 

npak, ну это я как пример, автор же не указал имена функций, что бы подсказать по точнее
Записан

Странно всё это....
ffobos
Интересующийся

ru
Offline Offline

« Ответ #16 : 18-01-2011 06:27 » new

"толи я дурак толи лыжи не так едут" вот код. издевался два дня, пробовал даже перезагружал машину не запуская Xservev компелировал была таже ошибка, сегодня все нормально заработало.
Код:
#include <stdio.h>   /* Стандартные объявления ввода/вывода */
#include <string.h>  /* Объявления строковых функций */
#include <unistd.h>  /* Объявления стандартных функций UNIX */
#include <fcntl.h>   /* Объявления управления файлами */
#include <errno.h>   /* Объявления кодов ошибок */
#include <time.h>

int main(void)
{
struct timespec ts;
time_t tm;
ffffh:
time(&tm);
printf("%ld\n", (long)tm);
sleep(1);
goto ffffh;
}
блогадорю всех за поддержку.

Добавлено через 9 минут и 57 секунд:
а вот здесь проругался следущим
/tmp/ccIIp1y2.o: In function `main':
asd.c:(.text+0x3a): undefined reference to `lock_gettime'
collect2: ld returned 1 exit status

Код:
int main(void)
{
struct timespec ts;
time_t tm;
ffffh:
time(&tm);
printf("%ld\n", (long)tm);
lock_gettime(CLOCK_REALTIME, &ts);
printf("%ld\n", (long)ts.tv_sec);

sleep(1);
goto ffffh;
}

Добавлено через 10 минут и 2 секунды:
lock_gettime(CLOCK_REALTIME, &ts); точнее cloсk_gettime(CLOCK_REALTIME, &ts); скопировал плохо
« Последнее редактирование: 18-01-2011 06:47 от ffobos » Записан
Антон (LogRus)
Глобальный модератор

ru
Offline Offline
Пол: Мужской
Внимание! Люблю сахар в кубиках!


WWW
« Ответ #17 : 18-01-2011 06:50 » 

ffobos, а откуда ты вообще взял эту функцию lock_gettime
язык C имеет такую интересную фишку, что он может не ругаться на неизвестные функции, а неявно создавать их объявления, что потом при линковке вылезает боком.

UPD: а с clock_gettime, проблемы уже нет?

Записан

Странно всё это....
ffobos
Интересующийся

ru
Offline Offline

« Ответ #18 : 18-01-2011 07:46 » 

clock_gettime
ругается но это не страшно в первом варианте я получил почти то что желал.
Записан
npak
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #19 : 18-01-2011 08:30 » 

clock_gettime
ругается но это не страшно в первом варианте я получил почти то что желал.

в мане по этой функции написано: "Most  systems  require  the program be linked with the librt library to use these functions." (http://www.tin.org/bin/man.cgi?section=3&topic=clock_gettime)

Поэтому надо добавить линкеру ключ -lrt
Записан

UniTesK -- индустриальная технология надежного тестирования.

http://www.unitesk.com/ru/
ffobos
Интересующийся

ru
Offline Offline

« Ответ #20 : 18-01-2011 15:03 » 

до 96 года я прогамил в машином коде часы вытаскивал прямо с биоса, патом армейка убила мой талант и я забил на программирования. недавно поставил на пробу ubuntu и понял что многое потерял.
Записан
Serg79
Команда клуба

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #21 : 18-01-2011 17:01 » 

ffobos, ну ты загнул:
до 96 года я прогамил в машином коде часы вытаскивал прямо с биоса
...
прям вот так ноликами и единичками программы клепал?
Записан
ffobos
Интересующийся

ru
Offline Offline

« Ответ #22 : 19-01-2011 00:32 » 

ffobos, ну ты загнул:
до 96 года я прогамил в машином коде часы вытаскивал прямо с биоса
...
прям вот так ноликами и единичками программы клепал?
нет! hex!

Добавлено через 1 минуту и 51 секунду:
только не говарити что я извращенец, вот что я хотел получить в итоге
Код:
#include <stdio.h>   /* Стандартные объявления ввода/вывода */
#include <string.h>  /* Объявления строковых функций */
#include <unistd.h>  /* Объявления стандартных функций UNIX */
#include <fcntl.h>   /* Объявления управления файлами */
#include <errno.h>   /* Объявления кодов ошибок */
#include <time.h>

int main(void)
{

time_t tm;
ffffh:
time(&tm);
double poays = 36000;/*10-часовой в секундах*/
double aaa = ((long)tm);
/*Вычисление даты Григорианского календаря по известному номеру юлианского дня, для UNIX 2440587.5 */
double JD;
JD = (((aaa+poays)/86400)+2440587.5);
long JDN = JD+0.5;
long data_a = JDN+32044;
int data_b = ((4*data_a)+3)/146097;
int data_c = data_a-((146097*data_b)/4);
int data_d = ((4*data_c)+3)/1461;
int data_e = data_c-((1461*data_d)/4);
int data_f = ((5*data_e)+2)/153;
int Day = data_e-(((153*data_f)+2)/5)+1;
int Month = data_f + 3 - 12*(data_f/10);
int Year = (100*data_b)+data_d-4800+(data_f/10);
/*расчет времени*/
double temp_time = (JD-JDN)*86400+43200;
int H_x = temp_time/60/60;
int M_x = ((temp_time)-(H_x*60*60))/60;
int C_x = (temp_time-0.5)-((H_x*60*60)+(M_x*60));

printf("%ld    %d.%d.%d  %d:%d:%d\n", (long)tm, Day, Month, Year, H_x, M_x, C_x);
sleep(1);
goto ffffh;
}

Добавлено через 2 часа, 36 минут и 26 секунд:
double poays = 36000;/*10-часовой в секундах*/-это часовой пояс в секундах

Добавлено через 2 часа, 4 минуты и 11 секунд:
поправка
Код:
#include <stdio.h>   /* Стандартные объявления ввода/вывода */
#include <string.h>  /* Объявления строковых функций */
#include <unistd.h>  /* Объявления стандартных функций UNIX */
#include <fcntl.h>   /* Объявления управления файлами */
#include <errno.h>   /* Объявления кодов ошибок */
#include <time.h>

int main(void)
{

time_t tm;
ffffh:
time(&tm);
double poays = 36000;/*10-часовой пояс в секундах*/
double aaa = ((long)tm);
/*Вычисление даты Григорианского календаря по известному номеру юлианского дня, для UNIX 2440587.5 */
double JD;
JD = (((aaa+poays)/86400)+2440587.5);
long JDN = JD+0.5;
long data_a = JDN+32044;
int data_b = ((4*data_a)+3)/146097;
int data_c = data_a-((146097*data_b)/4);
int data_d = ((4*data_c)+3)/1461;
int data_e = data_c-((1461*data_d)/4);
int data_f = ((5*data_e)+2)/153;
int Day = data_e-(((153*data_f)+2)/5)+1;
int Month = data_f + 3 - 12*(data_f/10);
int Year = (100*data_b)+data_d-4800+(data_f/10);
/*расчет времени*/
double temp_time = (JD-JDN)*86400+43200;
int H_x = temp_time/60/60;
int M_x = ((temp_time)-(H_x*60*60))/60;
double temp_time1 = ((JD)-JDN)*86400+43200;
int C_x = (temp_time1+0.1)-((H_x*60*60)+(M_x*60));
if (60-C_x)
    {goto qqq;}
else
 {M_x++; C_x=0;}
qqq:
if (60-M_x)
 {goto qqw;}
else
 {H_x++; M_x=0;}
qqw:
if (24-H_x)
 {goto qqe;}
else
 {H_x=0;}
qqe:
printf("%ld    %d.%d.%d  %f   %d:%d:%d\n", (long)tm, Day, Month, Year, temp_time1, H_x, M_x, C_x);
sleep(1);
goto ffffh;
}
« Последнее редактирование: 19-01-2011 03:10 от ffobos » Записан
RXL
Технический
Администратор

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #23 : 19-01-2011 04:48 » 

ffobos, извращенец не извращенец, но язык надо учить — goto оставь вместе с ассемблером.

Например:

Код: (C)
ffffh:
.....
goto ffffh

Код: (C)
while (1)
{
    .....
}

И отступы используй. Сразу станет понятнее.
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
ffobos
Интересующийся

ru
Offline Offline

« Ответ #24 : 19-01-2011 06:21 » 

ffobos, извращенец не извращенец, но язык надо учить — goto оставь вместе с ассемблером.

Например:

Код: (C)
ffffh:
.....
goto ffffh

Код: (C)
while (1)
{
    .....
}

И отступы используй. Сразу станет понятнее.
благодарю за подсказку, трудно учить без учителей.
Записан
Антон (LogRus)
Глобальный модератор

ru
Offline Offline
Пол: Мужской
Внимание! Люблю сахар в кубиках!


WWW
« Ответ #25 : 19-01-2011 08:46 » 

а чем функция asctime не угодила?
Записан

Странно всё это....
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines