Какой API я вызываю, чтобы получить время безотказной работы системы?

Я хотел бы получить время безотказной работы системы из приложения C, работающего в системе на основе Linux. Я не хочу вызывать uptime (1) и анализировать вывод, я бы хотел вызвать базовый C API, который, как я подозреваю, существует. Кто-нибудь знает, есть ли такой вызов, или uptime (1) просто обрабатывает записи, полученные из wtmp?


person Stéphane    schedule 08.10.2009    source источник
comment
возможно ли получить время безотказной работы за наносекунды ??? Ты пробовал ?   -  person Jeyaram    schedule 10.06.2014


Ответы (5)


Системный вызов, который вам нужен, - это sysinfo ().

Он определен в sys / sysinfo.h

Его подпись: int sysinfo (struct sysinfo * info)

Начиная с ядра 2.4, структура выглядела так:

struct sysinfo {
    long uptime;             /* Seconds since boot */
    unsigned long loads[3];  /* 1, 5, and 15 minute load averages */
    unsigned long totalram;  /* Total usable main memory size */
    unsigned long freeram;   /* Available memory size */
    unsigned long sharedram; /* Amount of shared memory */
    unsigned long bufferram; /* Memory used by buffers */
    unsigned long totalswap; /* Total swap space size */
    unsigned long freeswap;  /* swap space still available */
    unsigned short procs;    /* Number of current processes */
    unsigned long totalhigh; /* Total high memory size */
    unsigned long freehigh;  /* Available high memory size */
    unsigned int mem_unit;   /* Memory unit size in bytes */
    char _f[20-2*sizeof(long)-sizeof(int)]; /* Padding for libc5 */
};

Повеселись!

person Kyle Smith    schedule 09.10.2009
comment
Я реализовал чтение / proc / uptime, как было предложено выше, но вызов API вместо чтения файла - это именно то, что я хотел. Спасибо! - person Stéphane; 11.10.2009
comment
Можно ли получить информацию об уровне наносекунд (для времени безотказной работы) ?? - person Jeyaram; 10.06.2014

Это было бы примерно так.

#include <stdio.h>
#include <errno.h>
#include <linux/unistd.h>       /* for _syscallX macros/related stuff */
#include <linux/kernel.h>       /* for struct sysinfo */
#include <sys/sysinfo.h>

long get_uptime()
{
    struct sysinfo s_info;
    int error = sysinfo(&s_info);
    if(error != 0)
    {
        printf("code error = %d\n", error);
    }
    return s_info.uptime;
}

См. "Man sysinfo" для получения дополнительной информации.

person Johan    schedule 16.06.2010

Прочтите файл /proc/uptime и возьмите первое десятичное число в качестве времени безотказной работы в секундах.

Из man 5 proc:

   /proc/uptime
          This file contains two numbers: the uptime of the  system  (sec‐
          onds), and the amount of time spent in idle process (seconds).
person bdonlan    schedule 08.10.2009
comment
... и если вы strace команду uptime(1), вы увидите, что она делает именно это. - person caf; 09.10.2009
comment
caf: на машинах linux машины BSD обычно используют текущее время - syctl kern.boottime - person Tabitha; 09.10.2009
comment
@caf, uptime(1) делает гораздо больше, поэтому найти его может быть непросто :) - person bdonlan; 09.10.2009
comment
@Tarrant: этот подход дает неверные результаты, если кто-то сбрасывает текущее время с помощью API date или settimeofday (). Я ищу что-то, основанное на тиках, на которое не влияют настройки времени / даты - person hackworks; 16.11.2012

Также есть clock_gettime (возможно, потребуется -lrt ). Поведение, которое я видел (я не собираюсь утверждать, что оно гарантировано), но с учетом CLOCK_MONOTONIC в качестве clk_id, оно возвращает время безотказной работы системы в заданном параметре struct timespec *.

#include <stdio.h>
#include <time.h>

int main(int argc, char* argv[]) {
  struct timespec t;
  clock_gettime(CLOCK_MONOTONIC, &t);
  printf("tv_sec=%llu tv_nsec=%llu\n",
    (unsigned long long)t.tv_sec,
    (unsigned long long)t.tv_nsec);
  return 0;
}
person Community    schedule 11.02.2013
comment
Нет, это не так; монотонные часы имеют произвольную эпоху. Справочная страница, которую вы связали, говорит именно об этом. - person Lightness Races in Orbit; 17.05.2017
comment
@BoundaryImposition Вопрос помечен как linux, и в Linux поведение было (и по-прежнему как я описал). POSIX говорит, что эпоха произвольна, реализация Linux коррелирует с временем безотказной работы. См. kernel / time / posix-timers.c и fs / proc / uptime.c. И вот соответствующая ветка LKML. - person opello; 23.05.2017
comment
Вы связались с файлами реализации. Это может измениться в любой момент. Вопрос в API, а в API сказано, что эпоха произвольна. Произвольный не означает, что эпохи нет, это просто означает, что на выбор нельзя полагаться. Об этом говорится в ветке LKML, с которой вы меня связали. - person Lightness Races in Orbit; 23.05.2017
comment
И в своем ответе я написал, что не собираюсь утверждать, что это гарантировано. В тексте вопроса также конкретно упоминается Linux в качестве варианта использования. В потоке LKML также говорится, что поведение вряд ли изменится в ближайшее время. POSIX помогает писать код, который надежно работает на совместимых платформах. Если вариант использования охватывает только одну платформу, кажется вполне разумным полагаться на ее поведение. - person opello; 23.05.2017
comment
По причинам, описанным Lightness Races In Orbit, я бы сказал, что это плохой ответ. Существует рабочий api, специфичный для Linux, который не будет компилироваться в других ОС, что предпочтительнее, чем полагаться на специфичное для ОС поведение API-интерфейса os-general, который будет молча делать неправильные вещи в других ОС или при наличии будущих изменений. компилятору. - person lahwran; 14.02.2019

person    schedule
comment
Хороший ответ должен включать не только код, но и некоторое объяснение того, как он работает и почему отвечает на вопрос. Это особенно верно, поскольку уже есть принятый ответ на вопрос. - person Blackwood; 07.01.2016