Подтвердить что ты не робот

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

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

4b9b3361

Ответ 1

Системный вызов, который вы ищете, - 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 */
};

Удачи!

Ответ 2

Прочитайте файл /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).

Ответ 3

Это будет что-то вроде этого.

#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".

Ответ 4

Там также 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;
}

Ответ 5

#include <sys/sysinfo.h>
#include <sys/types.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <grp.h>

int main() {
  struct sysinfo sys_info;
  struct group* grp;

    gid_t gid;
    char** users;

  int days, hours, mins, x = 1;

  system("clear");  
  printf("\033[4;40m            Systems information                   \033[0;m \n");
  if(sysinfo(&sys_info) != 0)
    perror("sysinfo");

  days = sys_info.uptime / 86400;
  hours = (sys_info.uptime / 3600) - (days * 24);
  mins = (sys_info.uptime / 60) - (days * 1440) - (hours * 60);

  printf("\033[1;33m  Uptime: \033[0;36m %ddays, %dhours, %dminutes, %ldseconds \033[0;m \n",
                      days, hours, mins, sys_info.uptime % 60);

  printf("\033[1;33m  Load Avgs: \033[0;m 1min(%ld) 5min(%ld) 15min(%ld) \n",
          sys_info.loads[0], sys_info.loads[1], sys_info.loads[2]);

  printf("\033[1;33m  Total Ram: \033[0;m %ldk \t Free: %ldk \n", sys_info.totalram / 1024, sys_info.freeram / 1024);
  printf(" \033[1;33m Shared Ram: \033[0;m %ldk ", sys_info.sharedram / 1024);
  printf("  Buffered Ram: %ldk \n", sys_info.bufferram / 1024);
  printf("\033[1;33m  Total Swap: \033[0;m %ldk \t Free swap: %ldk \n", sys_info.totalswap / 1024, sys_info.freeswap / 1024);
  printf("\033[1;33m  Total High Memory: \033[0;m %ldk  Free high memory: %ldk \033[0;m \n", sys_info.totalhigh / 1024, sys_info.freehigh / 1024);
  printf(" \n");
  printf("\033[1;44m Total Number of processes: %d \033[0;m \n", sys_info.procs);  
  gid = getgid();
    printf("  Group ID: \033[031m %d", gid);
    if((grp = getgrgid(gid)) == NULL ) return 1;
    printf("\033[0;m Group %s ", grp->gr_name );
    printf("\n  Users in your group ");
    for( users = grp->gr_mem; *users != NULL; users++,++x ); printf( "%d", ++x);     
    if(strcmp(grp->gr_passwd,"x") == 0) printf("  Password is protected by shadow file. \n");
    else printf("Password: %s ", grp->gr_passwd);   

    return 0;
}