Vorrei ottenere il tempo di funzionamento del sistema da un'applicazione C in esecuzione su un sistema basato su Linux. Non voglio chiamare uptime (1) e analizzare l'output, mi piacerebbe chiamare l'API C sottostante che sospetto esista. Qualcuno sa se c'è una tale chiamata, o fa uptime (1) semplicemente elaborare i record ottenuti da wtmp?Quale API devo chiamare per ottenere il tempo di attività del sistema?
risposta
Il sistema di chiamata che stai cercando è sysinfo().
E 'definita in sys/sysinfo.h
La sua firma è: int sysinfo (struct sysinfo * info)
Dal kernel 2.4, la struttura ha guardato come questo:
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 */
};
Buon divertimento!
Ho implementato la lettura/proc/uptime come suggerito sopra bdonlan, ma chiamare un'API contro la lettura di un "file" è esattamente quello che volevo. Grazie! –
È possibile ottenere informazioni di livello nano secondi (per uptime) ?? – Jeyaram
Leggere il file /proc/uptime
e prendere il primo numero decimale come tempo di attività in secondi.
Da 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).
... e se si 'strace' il comando' uptime (1) ', vedrai che fa proprio questo. – caf
caf: su macchine Linux, le macchine BSD generalmente usano "ora corrente - kt.boottime syctl" – Tarrant
@caf, 'tempo di attività (1)' fa molto più di quello, quindi può essere un po 'difficile da trovare :) – bdonlan
Sarebbe qualcosa del genere.
Vedere "man sysinfo" per maggiori informazioni.
Ti manca: #include
C'è anche clock_gettime (probabilmente è necessario -lrt
). Il comportamento che ho visto (non ho intenzione di reclamare è garantito) ma dato CLOCK_MONOTONIC
come clk_id
è che restituisce il tempo di attività del sistema nel parametro struct timespec *
specificato.
#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;
}
No, non lo è; l'orologio monotono ha un'epoca arbitraria. La manpage che hai linkato dice proprio questo. –
@BoundaryImposition La domanda è contrassegnata da linux e in Linux il comportamento era (e [è ancora] (http://elixir.free-electrons.com/linux/latest/ident/CLOCK_MONOTONIC) come descritto). POSIX dice che l'epoca è arbitraria, l'implementazione di Linux è correlata al tempo di attività. Vedi [kernel/time/posix-timers.c] (http://elixir.free-electrons.com/linux/latest/source/kernel/time/posix-timers.c) e [fs/proc/uptime.c ] (http://elixir.free-electrons.com/linux/latest/source/fs/proc/uptime.c). E [ecco una discussione LKML pertinente] (https://lkml.org/lkml/2014/1/2/39). – opello
È collegato ai file di implementazione. Questo potrebbe cambiare in qualsiasi momento. La domanda riguarda l'API e l'API dice che l'epoca è arbitraria. Arbitrario non significa che non ci sia un'epoca, significa solo che non si può fare affidamento sulla scelta. Il thread LKML a cui mi hai collegato dichiara effettivamente questo. –
#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;
}
Una buona risposta dovrebbe includere non solo il codice ma anche alcune spiegazioni su come funziona e perché risponde alla domanda. Ciò è particolarmente vero in quanto esiste già una risposta accettata alla domanda. – Blackwood
- 1. Come ottenere il tempo di attività del sistema in Windows?
- 2. Ottenere il tempo di inattività del sistema con Qt
- 3. Come ottenere il tempo di avvio del sistema Android
- 4. Uso di django prefetch_related() per ottenere il tempo dell'ultima attività
- 5. Oggetto proxy per ottenere il tempo di sistema
- 6. Per quale sistema operativo BlackBerry minimo devo sviluppare?
- 7. Quale percentuale del tempo di programmazione spendi per il debug?
- 8. Stima del tempo nelle attività
- 9. Quale unità di tempo restituisce il tempo?
- 10. Attività gradle per chiamare altre attività nell'ordine
- 11. Chiamare API REST da un'app per android
- 12. Eclipse per ottenere il tempo di esecuzione del programma
- 13. Quale sistema SCM per Xcode?
- 14. In quale file è impostato il percorso del sistema Ubuntu?
- 15. Progettazione del sistema di elaborazione analitica in tempo reale
- 16. Devo chiamare File.Exists prima di chiamare File.Delete?
- 17. quale costruttore chiamare per la visualizzazione?
- 18. Devo chiamare Stop prima di leggere ElapsedMilliseconds?
- 19. Devo chiamare Graphics.Dispose()?
- 20. Chiamare il metodo API Win32 da Java
- 21. Come ottenere tempo di attività UNIX in Java?
- 22. Tempo corretto per chiamare viewDidAppear manualmente?
- 23. Che funzione del tempo devo usare con pthread_cond_timedwait?
- 24. Tweet Twitter API per intervallo di tempo
- 25. Quale CursorAdapter devo usare?
- 26. API Win32 per ottenere la lingua (informazioni di localizzazione) del sistema operativo?
- 27. Attività ripetitive in intervalli di tempo specifici?
- 28. Test del sistema operativo in tempo reale per durezza
- 29. Attività di apprendimento automatico: quale strumento utilizzare?
- 30. Quale attività IO supporta il gestore di GHC IO?
è possibile ottenere tempi di attività in nano secondi ??? Hai provato ? – Jeyaram