Sava
Участник
Offline
|
|
« : 04-03-2009 10:16 » |
|
кто-нибудь знает точность с которой вычисляет время эта функция. До одной миллисекунды или как? подскажите, пожалуйста. нигде не могу найти
|
|
|
Записан
|
|
|
|
RXL
|
|
« Ответ #1 : 04-03-2009 12:42 » |
|
http://www.opennet.ru/man.shtml?topic=gettimeofday&category=2&russian=0#include <sys/time.h>
int gettimeofday(struct timeval *tv, struct timezone *tz); int settimeofday(const struct timeval *tv , const struct timezone *tz); struct timeval { long tv_sec; /* секунды */ long tv_usec; /* микросекунды */ };
|
|
« Последнее редактирование: 04-03-2009 12:44 от RXL »
|
Записан
|
... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
|
|
|
Finch
Спокойный
Администратор
Offline
Пол:
Пролетал мимо
|
|
« Ответ #2 : 04-03-2009 12:43 » |
|
|
|
|
Записан
|
Не будите спашяго дракона. Джаффар (Коша)
|
|
|
Вад
|
|
« Ответ #3 : 04-03-2009 12:46 » |
|
Значение-то функция выдаст в микросекундах. А с какой точностью - это уже от точности системного таймера зависит. Далеко не факт, что он каждую микросекунду обновляется. Обычно такие счётчики имеют точность в 20-50 микросекунд, если не ошибаюсь.
|
|
|
Записан
|
|
|
|
Sla
|
|
« Ответ #4 : 04-03-2009 12:56 » |
|
в PC, если ничего не далать - 1/18 сек
|
|
|
Записан
|
Мы все учились понемногу... Чему-нибудь и как-нибудь.
|
|
|
RXL
|
|
« Ответ #5 : 04-03-2009 13:20 » |
|
На самом деле тут точность не определенная, т.к. переключение на задачу, ожидающую на таймере, может произойти не только по системному таймеру, но и при блокировке другой задаче в ядре.
|
|
|
Записан
|
... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
|
|
|
Антон (LogRus)
|
|
« Ответ #6 : 04-03-2009 16:39 » |
|
Думаю на некоторые вопросы ответит статья http://rus-linux.net/MyLDP/BOOKS/ldd2/6/ldd2_ch6.htmlОт себя хочу сказать, что частота прерываний ядра настраивается как минимум при компиляции ядра, насколько я помню для серваков рекомендуют 100(чего-то) для десктопных машин рекомендуют 1000 (чего-то) кстати, вопрос который надо было задать с самого начала: а нафига такие нюансы?
|
|
|
Записан
|
Странно всё это....
|
|
|
McZim
|
|
« Ответ #7 : 04-03-2009 20:01 » |
|
LogRus, не на самом деле по умолчанию, хоть сервер хоть десктоп прерывания одинаковы 250, а там уж кто на что горазд
|
|
|
Записан
|
The CBO without stats is like a morning without coffee. (c) T.Kyte.
|
|
|
Антон (LogRus)
|
|
« Ответ #8 : 05-03-2009 05:47 » |
|
McZim, может быть, я давно ядро не компилировал но помню что были рекомендации
|
|
|
Записан
|
Странно всё это....
|
|
|
RXL
|
|
« Ответ #9 : 05-03-2009 19:16 » |
|
Я в ядре не ковырялся давно - с 2.4. Там не было никакого выбора - константы были прописаны в заголовках asm/<platform> и значение для i386 было 100 Гц.
|
|
|
Записан
|
... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
|
|
|
Serg79
|
|
« Ответ #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
Интересующийся
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
Участник
Offline
|
|
« Ответ #12 : 17-01-2011 08:54 » |
|
a попробуйте при компиляции указывать параметр -lrt (вроде так, счас еще поищу)
|
|
|
Записан
|
|
|
|
Антон (LogRus)
|
|
« Ответ #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
|
|
« Ответ #14 : 17-01-2011 13:03 » |
|
обрати внимание на блок LIBRARY линковщику надо сказать, что бы он подключил libc для это пишешь в параметрах -lc , т.е. для подключение библиотеки нужно указать -l и имя библиотеки опустив префикс lib
По умолчанию в нормально настроенном gcc libc подцепляется "автоматом". Явно указывать её не требуется. ffobos, покажи командную строку gcc или Makefile
|
|
|
Записан
|
|
|
|
Антон (LogRus)
|
|
« Ответ #15 : 18-01-2011 04:34 » |
|
npak, ну это я как пример, автор же не указал имена функций, что бы подсказать по точнее
|
|
|
Записан
|
Странно всё это....
|
|
|
ffobos
Интересующийся
Offline
|
|
« Ответ #16 : 18-01-2011 06:27 » |
|
"толи я дурак толи лыжи не так едут" вот код. издевался два дня, пробовал даже перезагружал машину не запуская 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)
|
|
« Ответ #17 : 18-01-2011 06:50 » |
|
ffobos, а откуда ты вообще взял эту функцию lock_gettime язык C имеет такую интересную фишку, что он может не ругаться на неизвестные функции, а неявно создавать их объявления, что потом при линковке вылезает боком.
UPD: а с clock_gettime, проблемы уже нет?
|
|
|
Записан
|
Странно всё это....
|
|
|
ffobos
Интересующийся
Offline
|
|
« Ответ #18 : 18-01-2011 07:46 » |
|
clock_gettime ругается но это не страшно в первом варианте я получил почти то что желал.
|
|
|
Записан
|
|
|
|
npak
|
|
« Ответ #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
|
|
|
Записан
|
|
|
|
ffobos
Интересующийся
Offline
|
|
« Ответ #20 : 18-01-2011 15:03 » |
|
до 96 года я прогамил в машином коде часы вытаскивал прямо с биоса, патом армейка убила мой талант и я забил на программирования. недавно поставил на пробу ubuntu и понял что многое потерял.
|
|
|
Записан
|
|
|
|
Serg79
|
|
« Ответ #21 : 18-01-2011 17:01 » |
|
ffobos, ну ты загнул: до 96 года я прогамил в машином коде часы вытаскивал прямо с биоса ...
прям вот так ноликами и единичками программы клепал?
|
|
|
Записан
|
|
|
|
ffobos
Интересующийся
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
|
|
« Ответ #23 : 19-01-2011 04:48 » |
|
ffobos, извращенец не извращенец, но язык надо учить — goto оставь вместе с ассемблером. Например: ffffh: ..... goto ffffh while (1) { ..... } И отступы используй. Сразу станет понятнее.
|
|
|
Записан
|
... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
|
|
|
ffobos
Интересующийся
Offline
|
|
« Ответ #24 : 19-01-2011 06:21 » |
|
ffobos, извращенец не извращенец, но язык надо учить — goto оставь вместе с ассемблером. Например: ffffh: ..... goto ffffh while (1) { ..... } И отступы используй. Сразу станет понятнее. благодарю за подсказку, трудно учить без учителей.
|
|
|
Записан
|
|
|
|
Антон (LogRus)
|
|
« Ответ #25 : 19-01-2011 08:46 » |
|
а чем функция asctime не угодила?
|
|
|
Записан
|
Странно всё это....
|
|
|
|