2009-10-08 8 views
25

Ich möchte die Systemverfügbarkeit aus einer C-Anwendung auf einem Linux-basierten System erhalten. Ich möchte nicht uptime (1) aufrufen und die Ausgabe analysieren, möchte ich die zugrunde liegende C-API nennen, die ich vermute, existiert. Wer weiß, ob es einen solchen Anruf gibt, oder verarbeitet uptime (1) einfach die von wtmp erhaltenen Datensätze?Welche API rufe ich an, um die Systemverfügbarkeit zu erhalten?

+0

ist es möglich, die Betriebszeit in Nanosekunden zu bekommen ??? Hast du es versucht ? – Jeyaram

Antwort

30

Das System rufen Sie suchen ist sysinfo().

Es in sys/sysinfo.h definiert ist

Seine Unterschrift: int sysinfo (struct sysinfo * info)

Seit Kernel 2.4 hat sich die Struktur sah wie folgt 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 */ 
}; 

Viel Spaß!

+0

Ich habe reading/proc/uptime als bdonlan vorgeschlagen, aber das Aufrufen einer API gegen das Lesen einer "Datei" ist genau das, was ich wollte. Vielen Dank! –

+0

Ist es möglich, Informationen über die nano-Sekunden-Ebene zu erhalten (für die Betriebszeit)? – Jeyaram

12

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

Von 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). 
+2

... und wenn Sie den 'uptime (1)' Befehl "strace", werden Sie sehen, dass es genau das tut. – caf

+0

caf: auf Linux-Maschinen, BSD-Maschinen verwendet in der Regel "aktuelle Zeit - syctl kern.boottime" – Tarrant

+0

@caf, 'uptime (1)' tut viel mehr als nur das, so dass es ein wenig schwer zu finden :) – bdonlan

11

Das wäre so etwas.

Siehe "man sysinfo" für weitere Informationen.

+6

Sie vermissen: #include Frederik

3

Es gibt auch clock_gettime (wahrscheinlich benötigt -lrt). Das Verhalten, das ich gesehen habe (ich behaupte nicht, dass es garantiert ist), aber gegeben CLOCK_MONOTONIC als das clk_id ist, dass es die Systembetriebszeit im gegebenen struct timespec * Parameter zurückgibt.

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

Nein, tut es nicht; Die monotone Uhr hat eine beliebige Epoche. Die Manpage, die Sie verlinkt haben, sagt genau das. –

+0

@BoundaryImposition Die Frage ist getaggt Linux und in Linux war das Verhalten (und [ist noch] (http://elixir.free-electronics.com/linux/latest/ident/CLOCK_MONOTONIC) wie ich beschrieben). POSIX sagt, die Epoche sei beliebig, die Linux-Implementierung korreliere mit der Verfügbarkeit. Siehe [kernel/time/posix-timers.c] (http://elixir.free-electron.com/linux/latest/source/kernel/time/posix-timers.c) und [fs/proc/uptime.c ] (http://elixir.free-electronics.com/linux/latest/source/fs/proc/uptime.c). Und [hier ist ein relevanter LKML-Thread] (https://lkml.org/lkml/2014/1/2/39). – opello

+0

Sie haben mit Implementierungsdateien verknüpft. Dies könnte sich jederzeit ändern. Die Frage bezieht sich auf die API und die API sagt, dass die Epoche beliebig ist. Willkür bedeutet nicht, dass es keine Epoche gibt, es bedeutet nur, dass man sich nicht auf die Wahl verlassen kann. Der LKML-Thread, mit dem Sie mich verlinkt haben, gibt dies an. –

0
#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; 
} 
+1

Eine gute Antwort sollte nicht nur Code enthalten, sondern auch eine Erklärung, wie es funktioniert und warum es die Frage beantwortet. Dies gilt insbesondere, da bereits eine akzeptierte Antwort auf die Frage vorliegt. – Blackwood

Verwandte Themen