задача стоит узнать 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 практический ? не будет так что кол-во тиков уйдет у меня вперед случайно?
>
>Это 199 дней и не совсем понятно с какой точки отсчет.
>uptime что выдает
>uptime что выдаетверсия с использованием вызова sysinfo() работает правильно
она выдает такие же результаты что и команда uptime с консоли
несколько часов или минут, сколько там прошло со старта системы
но этот вариант не работает в solarisа вот times() выдает непонятные результаты
хотя результат корректно растет на 1 каждую секунду
>а вот times() выдает непонятные результаты
>хотя результат корректно растет на 1 каждую секундуПочему непонятные? Вполне понято Ж-D написано "number of clock ticks ... since an arbitrary point in the past".
>Почему непонятные? Вполне понято Ж-D написано "number of clock ticks ... since
>an arbitrary point in the past".я читал естественно это место в man
просто как то неопределенно. как все таки выбирается эта точка в прошлом.
в принципе для моих целей сгодится.
>просто как то неопределенно. как все таки выбирается эта точка в прошлом.ну, "arbitrary" же ж
arbitrary
[↗ɑ:bɪtrɜrɪ] _a.
1) произвольный
2) капризный
3) деспотический
4) _мат. arbitrary constant произвольная постоянная; arbitrary signs and
symbols условные знаки и обозначения
все таки я в смятении
на Debian 5 к примеру система выдает значения times() начиная с 1718110783 1718 миллионов
учитывая что в секунде 100 тиков
до переполнения которое наступает в 2147483647 остается всего 50 дней работы программы непрерывнойна RedHat к примеру начальное значения начинается от 456045334 примерно 456 миллионов
times ведь знаковое значение выдает
-1 означает ошибку
а все остальные значения в том числе отрицательные нет
т.е в моей ситуации время получается тикает от 1718110783 до 2147483647
а потом начинает от -2147483648 тикать до -1 уменьшаясь по модулю
>до переполнения которое наступает в 2147483647 остается всего 50 дней работы программы
>непрерывнойК сожалению сейчас проверить негде, но как я помню clock_t на линуксах все таки не разу ни int и до переполнения там ого-го.
Если не секрет каков смысл этого исследования?
>К сожалению сейчас проверить негде, но как я помню clock_t на линуксах
>все таки не разу ни int и до переполнения там
>ого-го.там вот так сделано на 32 системах , в коде ядра смотрел
так что до переполнения 2 млрд всегоtypedef long __kernel_clock_t;
typedef __kernel_clock_t clock_t;>Если не секрет каков смысл этого исследования?
переполнение мешает
>>Если не секрет каков смысл этого исследования?
>переполнение мешаетну если дело только в нем, то забейте на -1
errno = 0;
t = times(...);
if (errno != 0)
err(1, "times()");
да и поймать там ошибку не реально.
>точность высокая не нужна, 1 сек вполне достаточно поэтому использовать posix таймеры нет необходимости.Ну и что ж теперь из-за лишнего поля tv_nsec их не использовать?