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?
Welche API rufe ich auf, um die Systemverfügbarkeit zu erhalten?
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
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
dasuptime(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.
– BlackwoodJan 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.
– BlackwoodJan 7, 2016 at 20:28
Ist es möglich, die Betriebszeit in Nanosekunden zu erreichen ??? Hast du es versucht ?
– Jeyaram
10. Juni 2014 um 5:32 Uhr