Welche API rufe ich auf, um die Systemverfügbarkeit zu erhalten?

Lesezeit: 4 Minuten

Ich möchte die Systemverfügbarkeit aus einer C-Anwendung heraus erhalten, die auf einem Linux-basierten System ausgeführt wird. Ich möchte nicht uptime(1) aufrufen und die Ausgabe analysieren, ich möchte die zugrunde liegende C-API aufrufen, von der ich vermute, dass sie existiert. Weiß jemand, ob es einen solchen Aufruf gibt, oder verarbeitet uptime(1) einfach Datensätze, die von wtmp erhalten wurden?

  • Ist es möglich, die Betriebszeit in Nanosekunden zu erreichen ??? Hast du es versucht ?

    – Jeyaram

    10. Juni 2014 um 5:32 Uhr

Der gesuchte Systemaufruf ist sysinfo().

Es ist in sys/sysinfo.h definiert

Seine Signatur lautet: int sysinfo(struct sysinfo *info)

Seit Kernel 2.4 sieht die Struktur so aus:

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 */
};

Habe Spaß!

  • Ich hatte das Lesen von /proc/uptime wie oben von bdonlan vorgeschlagen implementiert, aber das Aufrufen einer API im Vergleich zum Lesen einer “Datei” ist genau das, was ich wollte. Vielen Dank!

    – Stefan

    11. Oktober 2009 um 6:01 Uhr

  • Ist es möglich, Informationen auf Nanosekundenebene (für die Betriebszeit) zu erhalten?

    – Jeyaram

    10. Juni 2014 um 5:31 Uhr

Benutzer-Avatar
Johann

Das wäre so etwas.

#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;
}

Weitere Informationen finden Sie unter “man sysinfo”.

Lesen Sie die Datei /proc/uptime und nehmen Sie die erste Dezimalzahl als Betriebszeit in Sekunden.

Aus 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).

  • …Und wenn Du strace das uptime(1) Befehl, Sie werden sehen, dass es genau das tut.

    – Café

    8. Oktober 2009 um 21:37 Uhr

  • caf: Auf Linux-Rechnern verwenden BSD-Rechner im Allgemeinen “aktuelle Zeit – syctl kern.boottime”

    – Tabita

    9. Oktober 2009 um 0:58 Uhr

  • @café, uptime(1) macht viel mehr als nur das, daher kann es etwas schwer zu finden sein 🙂

    – bdonlan

    9. Oktober 2009 um 2:17 Uhr

  • @Tarrant: Dieser Ansatz liefert falsche Ergebnisse, wenn jemand die aktuelle Uhrzeit mit der API „date“ oder settimeofday() zurücksetzt. Ich suche nach etwas, das auf Ticks basiert, die nicht von Zeit-/Datumseinstellungen beeinflusst werden können

    – 0xdky

    16. November 2012 um 3:10 Uhr

Es gibt auch clock_gettime (braucht wohl -lrt). Das Verhalten habe ich gesehen (ich behaupte nicht, dass es garantiert ist) aber gegeben CLOCK_MONOTONIC als die clk_id ist, dass es die Systemverfügbarkeit in der gegebenen Form zurückgibt struct timespec * Parameter.

#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;
}

#include  #include  #include  #include  #include  #include  #include  int main() { struct sysinfo sys_info;  struct group* grp;  gid_t gid;  char**-Benutzer;  int Tage, Stunden, Minuten, x = 1;  system("löschen");  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;
}

  • A good answer should include not just code but also some explanation of how it works and why it answers the question. This is particularly true as there is already an accepted answer to the question.

    – Blackwood

    Jan 7, 2016 at 20:28

  • A good answer should include not just code but also some explanation of how it works and why it answers the question. This is particularly true as there is already an accepted answer to the question.

    – Blackwood

    Jan 7, 2016 at 20:28

1386150cookie-checkWelche API rufe ich auf, um die Systemverfügbarkeit zu erhalten?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy