2009-10-08 5 views
25

Me gustaría obtener el tiempo de actividad del sistema desde una aplicación C que se ejecuta en un sistema basado en Linux. No quiero llamar al tiempo de actividad (1) y analizar el resultado, me gustaría llamar a la API C subyacente que sospecho que existe. ¿Alguien sabe si existe tal llamada, o el tiempo de actividad (1) simplemente procesa los registros obtenidos de wtmp?¿A qué API llamo para obtener el tiempo de actividad del sistema?

+0

es posible obtener el tiempo de actividad en nano segundos ??? Has probado ? – Jeyaram

Respuesta

30

El sistema de llamada que está buscando es sysinfo().

Se define en sys/sysinfo.h

Su firma es: int sysinfo (struct sysinfo * info)

Desde el núcleo 2.4, la estructura se ha parecido a esto:

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 */ 
}; 

¡Diviértete!

+0

Implementé reading/proc/uptime como bdonlan sugerido anteriormente, pero llamar a una API versus leer un "archivo" es exactamente lo que quería. ¡Gracias! –

+0

¿Es posible obtener información de nivel de nano segundos (para el tiempo de actividad)? – Jeyaram

12

Lea el archivo /proc/uptime y tome el primer número decimal como el tiempo de actividad en segundos.

De 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

... y si 'strace' el comando 'uptime (1)', verá que hace exactamente eso. – caf

+0

caf: en las máquinas Linux, las máquinas BSD generalmente utilizan "tiempo actual - kernel.wottime.sctl" – Tarrant

+0

@caf, 'uptime (1)' hace mucho más que eso, por lo que puede ser un poco difícil de encontrar :) – bdonlan

11

Eso sería algo como esto.

Consulte "man sysinfo" para obtener más información.

+6

Falta: #include Frederik

3

También hay clock_gettime (probablemente necesite -lrt). El comportamiento que he visto (no voy a decir que está garantizado), pero dado CLOCK_MONOTONIC como clk_id es que devuelve el tiempo de actividad del sistema en el parámetro dado struct timespec *.

#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, no; el reloj monotónico tiene una época arbitraria. La página de manual que vinculaste dice eso. –

+0

@BoundaryImposition La pregunta está etiquetada como linux y en Linux el comportamiento era (y [todavía es] (http://elixir.free-electrons.com/linux/latest/ident/CLOCK_MONOTONIC) como describí). POSIX dice que la época es arbitraria, la implementación de Linux se correlaciona con el tiempo de actividad. Ver [kernel/time/posix-timers.c] (http://elixir.free-electrons.com/linux/latest/source/kernel/time/posix-timers.c) y [fs/proc/uptime.c ] (http://elixir.free-electrons.com/linux/latest/source/fs/proc/uptime.c). Y [aquí hay un hilo LKML relevante] (https://lkml.org/lkml/2014/1/2/39). – opello

+0

Has vinculado a archivos de implementación. Esto podría cambiar en cualquier momento. La pregunta es sobre la API, y la API dice que la época es arbitraria. Arbitrario no significa que no hay una época, simplemente significa que no se debe confiar en la elección. El hilo LKML que me vinculó realmente lo dice. –

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 buena respuesta debe incluir no solo el código, sino también una explicación de cómo funciona y por qué responde la pregunta. Esto es particularmente cierto ya que ya hay una respuesta aceptada a la pregunta. – Blackwood

Cuestiones relacionadas