Я хотел бы получить время безотказной работы системы из приложения C, работающего в системе на основе Linux. Я не хочу вызывать uptime (1) и анализировать вывод, я бы хотел вызвать базовый C API, который, как я подозреваю, существует. Кто-нибудь знает, есть ли такой вызов, или uptime (1) просто обрабатывает записи, полученные из wtmp?
Какой API я вызываю, чтобы получить время безотказной работы системы?
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
Я реализовал чтение / proc / uptime, как было предложено выше, но вызов API вместо чтения файла - это именно то, что я хотел. Спасибо!
- person Stéphane; 11.10.2009
Можно ли получить информацию об уровне наносекунд (для времени безотказной работы) ??
- 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
... и если вы
strace
команду uptime(1)
, вы увидите, что она делает именно это.
- person caf; 09.10.2009
caf: на машинах linux машины BSD обычно используют текущее время - syctl kern.boottime
- person Tabitha; 09.10.2009
@caf,
uptime(1)
делает гораздо больше, поэтому найти его может быть непросто :)
- person bdonlan; 09.10.2009
@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
Нет, это не так; монотонные часы имеют произвольную эпоху. Справочная страница, которую вы связали, говорит именно об этом.
- person Lightness Races in Orbit; 17.05.2017
@BoundaryImposition Вопрос помечен как linux, и в Linux поведение было (и по-прежнему как я описал). POSIX говорит, что эпоха произвольна, реализация Linux коррелирует с временем безотказной работы. См. kernel / time / posix-timers.c и fs / proc / uptime.c. И вот соответствующая ветка LKML.
- person opello; 23.05.2017
Вы связались с файлами реализации. Это может измениться в любой момент. Вопрос в API, а в API сказано, что эпоха произвольна. Произвольный не означает, что эпохи нет, это просто означает, что на выбор нельзя полагаться. Об этом говорится в ветке LKML, с которой вы меня связали.
- person Lightness Races in Orbit; 23.05.2017
И в своем ответе я написал, что не собираюсь утверждать, что это гарантировано. В тексте вопроса также конкретно упоминается Linux в качестве варианта использования. В потоке LKML также говорится, что поведение вряд ли изменится в ближайшее время. POSIX помогает писать код, который надежно работает на совместимых платформах. Если вариант использования охватывает только одну платформу, кажется вполне разумным полагаться на ее поведение.
- person opello; 23.05.2017
По причинам, описанным Lightness Races In Orbit, я бы сказал, что это плохой ответ. Существует рабочий api, специфичный для Linux, который не будет компилироваться в других ОС, что предпочтительнее, чем полагаться на специфичное для ОС поведение API-интерфейса os-general, который будет молча делать неправильные вещи в других ОС или при наличии будущих изменений. компилятору.
- person lahwran; 14.02.2019
person
schedule
Хороший ответ должен включать не только код, но и некоторое объяснение того, как он работает и почему отвечает на вопрос. Это особенно верно, поскольку уже есть принятый ответ на вопрос.
- person Blackwood; 07.01.2016