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?
Respuesta
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!
Implementé reading/proc/uptime como bdonlan sugerido anteriormente, pero llamar a una API versus leer un "archivo" es exactamente lo que quería. ¡Gracias! –
¿Es posible obtener información de nivel de nano segundos (para el tiempo de actividad)? – Jeyaram
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).
... y si 'strace' el comando 'uptime (1)', verá que hace exactamente eso. – caf
caf: en las máquinas Linux, las máquinas BSD generalmente utilizan "tiempo actual - kernel.wottime.sctl" – Tarrant
@caf, 'uptime (1)' hace mucho más que eso, por lo que puede ser un poco difícil de encontrar :) – bdonlan
Eso sería algo como esto.
Consulte "man sysinfo" para obtener más información.
Falta: #include
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;
}
No, no; el reloj monotónico tiene una época arbitraria. La página de manual que vinculaste dice eso. –
@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
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. –
#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 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
- 1. ¿Cómo obtener el tiempo de actividad del sistema en Windows?
- 2. Obtener getrusage() para medir el tiempo del sistema en C
- 3. Objeto proxy para obtener el tiempo del sistema
- 4. Cómo obtener el tiempo de actividad del sistema iOS, que no se detiene cuando está dormido
- 5. Win32 API para obtener el idioma (información de localización) del sistema operativo?
- 6. ¿Cómo obtener el tiempo de actividad de UNIX en Java?
- 7. Programado para obtener el tiempo de arranque del sistema en C++ (windows)
- 8. API independiente del sistema operativo para supervisar el sistema de archivos?
- 9. Tiempo de inactividad de actividad para ActivityRecord
- 10. ¿La API timeBeginPeriod afecta el reloj del sistema?
- 11. Obtener el tamaño del sistema RAM
- 12. ¿Cómo llamo API remota usando Phonegap para Android?
- 13. ¿La mejor manera de obtener el tiempo actual mediante API?
- 14. Eclipse para obtener el tiempo de ejecución del programa
- 15. Perdiendo tiempo sin cambiar el reloj del sistema de Windows
- 16. Tiempo de compilación del sistema operativo
- 17. Qué configuración regional debo especificar cuando llamo a String toLowerCase
- 18. Obtener salida de símbolo del sistema a cadena en Java
- 19. Obtener fuente predeterminada del sistema
- 20. ¿Cómo obtener información sobre el sistema de archivos del disco?
- 21. cómo obtener el tema de diálogo redondeado para la actividad
- 22. Cómo obtener estadísticas del sistema con node.js
- 23. ¿Qué es en Java el 'paquete por defecto del sistema'?
- 24. Obtener el nombre del sistema operativo del cliente
- 25. Obtener el evento de cierre de sesión del sistema
- 26. ¿Tiempo de CPU de usuario frente a tiempo de CPU del sistema?
- 27. Cómo obtener la configuración regional del sistema y el idioma del sistema en cocoa
- 28. Cómo obtener los colores del sistema Android
- 29. Obtener el tamaño de la memoria del sistema operativo Java
- 30. historial de tiempo de actividad de linux
es posible obtener el tiempo de actividad en nano segundos ??? Has probado ? – Jeyaram