Ответ 1
Предполагая, что ядро Linux запускает счетчик времени безотказной работы одновременно с началом отслеживания монотонных часов, вы можете получить время загрузки (относительно Epoch), вычитая время безотказной работы из текущее время.
Linux предлагает время безотказной работы системы через секунды через структуру sysinfo
; текущее время в секундах с момента, когда Epoch может быть приобретено в POSIX-совместимых библиотеках через функцию time
.
#include <stddef.h>
#include <stdio.h>
#include <time.h>
#include <sys/sysinfo.h>
int main(void){
/* get uptime in seconds */
struct sysinfo info;
sysinfo(&info);
/* calculate boot time in seconds since the Epoch */
const time_t boottime = time(NULL) - info.uptime;
/* get monotonic clock time */
struct timespec monotime;
clock_gettime(CLOCK_MONOTONIC, &monotime);
/* calculate current time in seconds since the Epoch */
time_t curtime = boottime + monotime.tv_sec;
/* get realtime clock time for comparison */
struct timespec realtime;
clock_gettime(CLOCK_REALTIME, &realtime);
printf("Boot time = %s", ctime(&boottime));
printf("Current time = %s", ctime(&curtime));
printf("Real Time = %s", ctime(&realtime.tv_sec));
return 0;
}
К сожалению, монотонные часы могут не соответствовать точному времени загрузки. Когда я тестировал вышеприведенный код на своей машине, монотонные часы были секундой от времени безотказной работы системы. Тем не менее, вы все равно можете использовать монотонные часы до тех пор, пока вы учитываете соответствующее смещение.
Заметка о переносимости: хотя Linux может возвращать текущее монотонное время относительно времени загрузки, POSIX-машинам в целом разрешено возвращать текущее монотонное время из любого произвольного, но согласованного момента времени (часто Эпоха).
В качестве дополнительной заметки вам может не потребоваться время загрузки, как и я. Я подозреваю, что есть способ получить время загрузки через API Linux, так как есть много утилит Linux, которые отображают время загрузки в удобном для восприятия формате. Например:
$ who -b
system boot 2013-06-21 12:56
Мне не удалось найти такой вызов, но проверка исходного кода для некоторых из этих общих утилит может показать, как они определяют время загрузки для человека.
В случае утилиты who
, я подозреваю, что она использует файл utmp
для получения времени загрузки системы.