| 
			| 
					
						| 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 localtimeNAME
 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 Добавлено через 10 минут и 2 секунды: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;
 }
 
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 секунду: только не говарити что я извращенец, вот что я хотел получить в итоге Добавлено через 2 часа, 36 минут и 26 секунд:#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;
 }
 
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 не угодила? |  
						| 
								|  |  
								|  |  Записан | 
 
 Странно всё это.... |  |  | 
	|  |