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?
Antwort
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ß!
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! –
Ist es möglich, Informationen über die nano-Sekunden-Ebene zu erhalten (für die Betriebszeit)? – Jeyaram
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).
... und wenn Sie den 'uptime (1)' Befehl "strace", werden Sie sehen, dass es genau das tut. – caf
caf: auf Linux-Maschinen, BSD-Maschinen verwendet in der Regel "aktuelle Zeit - syctl kern.boottime" – Tarrant
@caf, 'uptime (1)' tut viel mehr als nur das, so dass es ein wenig schwer zu finden :) – bdonlan
Das wäre so etwas.
Siehe "man sysinfo" für weitere Informationen.
Sie vermissen: #include
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;
}
Nein, tut es nicht; Die monotone Uhr hat eine beliebige Epoche. Die Manpage, die Sie verlinkt haben, sagt genau das. –
@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
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. –
#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;
}
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
- 1. Systemverfügbarkeit in iOS/Swift erhalten
- 2. Welche API rufe ich auf, um das Passwort eines Benutzers auf Linux zu setzen?
- 3. Wie rufe ich die Win32-API von einem Cygwin-Programm
- 4. Welche API sollte ich verwenden, um ein Sublime-Text-Plugin zu schreiben, um die Hinweise anzuzeigen
- 5. Wie rufe ich C von Go über die "Fremdfunktionsschnittstelle" an?
- 6. RSS API, um TED Videos zu erhalten
- 7. SoftLayer API, um die ID für OS-Partitionsvorlagen zu erhalten
- 8. Twitter API, um aktuelle Tweets eines bestimmten Benutzers zu erhalten
- 9. Welche Twitter-API sollte ich verwenden, um große Mengen an Tweets für die NLP-Forschung zu extrahieren?
- 10. Amazon Order API oder Report API, um die Artikelnummer und die Gesamtmenge zu erhalten?
- 11. Wie kann ich die Facebook Graph API verwenden, um die Empfehlungen meiner Website zu erhalten?
- 12. Wie verwende ich die Auftrags-ID, um Bestellinformationen zu erhalten?
- 13. Wie rufe ich eine Flask-Ansicht von einem anderen an?
- 14. Welche API wird verwendet, um E-Mail-Kontakte von Google zu erhalten?
- 15. Welche Braintree API zu zahlen, um mehrere Anbieter an der Kasse
- 16. Welche AT-Befehle sind hilfreich, um SIM-Daten zu erhalten?
- 17. Scala rekursive API-Aufrufe, um alle Ergebnisse zu erhalten
- 18. Vbs, um Daten von einem API-Aufruf zu erhalten
- 19. Subtrahieren zweimal, um die Dauer zu erhalten
- 20. OSS Nexus: Wie verwende ich REST API um die letzte Version als Text zu erhalten
- 21. Kann ich Fitbit Api verwenden, um die Beschleunigungsdaten meines Fitbit zu erhalten?
- 22. Wie verwende ich die Trello API, um alle Karten mit einem violetten Etikett zu erhalten?
- 23. Kann ich die statische Google Maps-API verwenden, um "meine Karten" zu erhalten?
- 24. Welche Maven-Artefakte sollte ich verwenden, um PowerMock zu importieren?
- 25. Wie kann ich die Informationen der Karte erhalten, die ich anklicke, um sie an die nächste Aktivität zu senden
- 26. Welche lib importiere ich um create_shortcut() in Python zu benutzen?
- 27. Exchange 2003 - Welche API wird verwendet, um die Verfügbarkeit von Räumen/Ressourcen zu ermitteln?
- 28. Welche Python-Tools kann ich verwenden, um mit der API einer Website zu interagieren?
- 29. Wie verwende ich die Google SpreadSheets-API, um Daten an eine Anwendung zu übermitteln?
- 30. Wie rufe ich das evernote-struct-Objekt auf, um alle Notizen in einem Notizbuch zu melden?
ist es möglich, die Betriebszeit in Nanosekunden zu bekommen ??? Hast du es versucht ? – Jeyaram