2009-10-08 10 views
25

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?

+0

è possibile ottenere tempi di attività in nano secondi ??? Hai provato ? – Jeyaram

risposta

30

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!

+0

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! –

+0

È possibile ottenere informazioni di livello nano secondi (per uptime) ?? – Jeyaram

12

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

... e se si 'strace' il comando' uptime (1) ', vedrai che fa proprio questo. – caf

+0

caf: su macchine Linux, le macchine BSD generalmente usano "ora corrente - kt.boottime syctl" – Tarrant

+0

@caf, 'tempo di attività (1)' fa molto più di quello, quindi può essere un po 'difficile da trovare :) – bdonlan

11

Sarebbe qualcosa del genere.

Vedere "man sysinfo" per maggiori informazioni.

+6

Ti manca: #include Frederik

3

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

No, non lo è; l'orologio monotono ha un'epoca arbitraria. La manpage che hai linkato dice proprio questo. –

+0

@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

+0

È 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. –

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

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

Problemi correlati