URL: https://www.opennet.me/cgi-bin/openforum/vsluhboard.cgi
Форум: vsluhforumID9
Нить номер: 8678
[ Назад ]

Исходное сообщение
"что возвращает системный вызов times, переносимо узнать uptime"

Отправлено Kane , 06-Апр-10 10:38 
задача стоит узнать uptime системы или сделать какую то хоть засечку времени для временного контроля. это должно работать не только в linux, но и хотя бы в solaris.
точность высокая не нужна, 1 сек вполне достаточно поэтому использовать posix таймеры нет необходимости.

вот способ который будет работать только в linux ,  вызов sysinfo присутствует только в linux. Это непереносимо.

#include <sys/sysinfo.h>

int main (void)
{
    struct sysinfo info;

    int recf = sysinfo(&info);

    printf("recf=%d   \n\r" , recf);
    printf("Uptime = %d\n",info.uptime);

    return 0;
}


Второй способ будет работать почти везде, в Solaris точно

#include<sys/times.h>
#include<limits.h>
#include<unistd.h>
#include<time.h>


main()
{
clock_t ticks;
struct tms tmp;
long ticks_per_sec;
ticks=times(&tmp);

ticks_per_sec=sysconf(_SC_CLK_TCK);

printf("System up for %d seconds. ticks:%d tickspersec:%d \n"
, ticks/ticks_per_sec , ticks, ticks_per_sec);
}

Этот способ подходит всем, но я получаю непонятные значения.

на моей системе я получаю значения
17207405 sec   1720740538 ticks    100 ticks per second

Это 199 дней и не совсем понятно с какой точки отсчет.

в документации написано, что times возвращает количество tick с произвольной точки в прошлом.

times() returns the number of clock ticks that have elapsed since an arbitrary point in the past. The return value may overflow the possible range of type clock_t. On error, (clock_t) -1 is returned, and errno is set appropriately.  

у кого нить есть опыт использования times практический ? не будет так что кол-во тиков уйдет у меня вперед случайно?



Содержание

Сообщения в этом обсуждении
"что возвращает системный вызов times, переносимо узнать upti..."
Отправлено Doka , 06-Апр-10 11:59 

>
>Это 199 дней и не совсем понятно с какой точки отсчет.
>

uptime что выдает


"что возвращает системный вызов times, переносимо узнать upti..."
Отправлено Kane , 06-Апр-10 13:25 
>uptime что выдает

версия с использованием вызова sysinfo() работает правильно
она выдает такие же результаты что и команда uptime с консоли
несколько часов или минут, сколько там прошло со старта системы
но этот вариант не работает в solaris

а вот times() выдает непонятные результаты
хотя результат корректно растет на 1 каждую секунду


"что возвращает системный вызов times, переносимо узнать upti..."
Отправлено Andrey Mitrofanov , 06-Апр-10 13:40 
>а вот times() выдает непонятные результаты
>хотя результат корректно растет на 1 каждую секунду

Почему непонятные? Вполне понято Ж-D написано "number of clock ticks ... since an arbitrary point in the past".


"что возвращает системный вызов times, переносимо узнать upti..."
Отправлено Kane , 06-Апр-10 15:08 
>Почему непонятные? Вполне понято Ж-D написано "number of clock ticks ... since
>an arbitrary point in the past".

я читал естественно это место в man
просто как то неопределенно. как все таки выбирается эта точка в прошлом.
в принципе для моих целей сгодится.


"что возвращает системный вызов times, переносимо узнать upti..."
Отправлено Andrey Mitrofanov , 06-Апр-10 17:43 
>просто как то неопределенно. как все таки выбирается эта точка в прошлом.

ну, "arbitrary" же ж

arbitrary
   [↗ɑ:bɪtrɜrɪ] _a.
   1) произвольный
   2) капризный
   3) деспотический
   4) _мат. arbitrary constant произвольная постоянная; arbitrary signs and
   symbols условные знаки и обозначения


"что возвращает системный вызов times, переносимо узнать upti..."
Отправлено Kane , 02-Июл-10 11:32 
все таки я в смятении
на Debian 5  к примеру система выдает значения times() начиная с 1718110783  1718 миллионов
учитывая что в секунде 100 тиков
до переполнения которое наступает в 2147483647 остается всего 50 дней работы программы непрерывной

на RedHat к примеру начальное значения начинается от 456045334  примерно 456 миллионов

times ведь знаковое значение выдает
-1 означает ошибку
а все остальные значения в том числе отрицательные нет
т.е в моей ситуации время получается тикает от 1718110783 до 2147483647
а потом начинает от -2147483648 тикать до -1 уменьшаясь по модулю


"что возвращает системный вызов times, переносимо узнать upti..."
Отправлено guest , 02-Июл-10 17:23 
>до переполнения которое наступает в 2147483647 остается всего 50 дней работы программы
>непрерывной

К сожалению сейчас проверить негде, но как я помню clock_t на линуксах все таки не разу ни int и до переполнения  там ого-го.

Если не секрет каков смысл этого исследования?


"что возвращает системный вызов times, переносимо узнать upti..."
Отправлено Kane , 05-Июл-10 11:01 
>К сожалению сейчас проверить негде, но как я помню clock_t на линуксах
>все таки не разу ни int и до переполнения  там
>ого-го.

там вот так сделано на 32 системах , в коде ядра смотрел
так что до переполнения 2 млрд всего

typedef long        __kernel_clock_t;
typedef __kernel_clock_t clock_t;

>Если не секрет каков смысл этого исследования?

переполнение мешает


"что возвращает системный вызов times, переносимо узнать upti..."
Отправлено guest , 05-Июл-10 22:52 
>>Если не секрет каков смысл этого исследования?
>переполнение мешает

ну если дело только в нем, то забейте на -1
errno = 0;
t = times(...);
if (errno != 0)
     err(1, "times()");
да и поймать там ошибку не реально.


"что возвращает системный вызов times, переносимо узнать uptime"
Отправлено const86 , 13-Июл-10 18:54 
>точность высокая не нужна, 1 сек вполне достаточно поэтому использовать posix таймеры нет необходимости.

Ну и что ж теперь из-за лишнего поля tv_nsec их не использовать?