viernes, 28 de septiembre de 2012

Medidor de la Ram hecho en C, para Ubuntu

Bueno el objeto de este articulo es mostrar como ver la memoria RAM tanto ocupada como disponible que posee una computadora que corre un sistema Linux, este fue un proyecto sencillo en que un amigo me pidió ayuda porque necesitaba que fuera hecho en el lenguaje c, luego de buscar un rato en Internet me encontré con esto http://linux.about.com/library/cmd/blcmdl2_sysinfo.htm , así que con la teoría nos dispusimos a hacer el programa:

1 #include <stdio.h>
2 #include <sys/sysinfo.h>
3 #include <math.h>
4
5 int main(int argc, char **argv)
6 {
7 struct sysinfo sys_info;
8 unsigned long ram_total, ram_ocupada, ram_libre;
9
10 if(sysinfo(&sys_info) != 0){
11 perror("sysinfo fallo!!!");
12 return 1;
13 }
14 printf("********************RAM*******************\n\n");
15 // Total de ram y ram libre.
16 ram_total = sys_info.totalram * sys_info.mem_unit / pow(2,20);
17 ram_libre = sys_info.freeram * sys_info.mem_unit / pow(2, 20);
18 ram_ocupada = ram_total - ram_libre;
19
20 printf("Ram Total:\t%ld\tMb\n", ram_total);
21 printf("Ram Ocupada:\t%ld\tMb\n", ram_ocupada);
22 printf("Ram Libre:\t%ld\tMb\n", ram_libre);
23  
24 //Porcentaje total de ram y ram libre
25 printf("\nRam ocupada: %2.2f%% \t Ram libre: %2.2f%%\n", (ram_ocupada * 100.0)/ram_total, (ram_libre * 100.0)/ram_total);
26   
27 //Numero de procesos corriendo actualmente
28 printf("Numero de Procesos: %d\n", sys_info.procs); 
29 return 0;
30 }
Un poco de la explicación del funcionamiento del programa, como puede verse en la parte de arriba inicia con la solicitud a las librerías lineas 1 a 3, la mas interesante es <sys/sysinfo> que es en la que nos basaremos para obtener información del sistema, en la linea 7 se inicializa una estructura sysinfo llamada sys_info, en la línea 10 llenamos nuestra estructura, llamando a la función sysinfo(&sys_info) la cual llena la estructura con la información del sistema toma como argumento un apuntador a una estructura sysinfo por eso vemos el &sys_info en la llamada y devuelve un valor diferente de 0 en caso de haber ocurrido un error que se comprueba con el if.

Bueno como nota para entender las lineas 16 a 18, la estructura sysinfo sufrió una modificación desde Linux 2.3.23 (i386), 2.3.48(todas las arquitecturas), algo que se explica en el enlace que deje arriba, los datos que regresan los campos que tienen relación con la memoria en la estructura sysinfo están dados en múltiplos de un campo que tiene la estructura llamado mem_unit, por este motivo para saber el tamaño real es necesario multiplicar el campo de la memoria por mem_unit para obtener su tamaño en bytes, y por ultimo lo dividimos yo use 2 elevada a 20 que es un Megabyte, así que mis datos quedaron en Mb.

Si queremos saber si el programa funciona correctamente podemos compararlo una manera sencilla es abrir una terminal y teclear el comando "free". 

 Autor intelectual: Mr.-Bushido

No hay comentarios:

Publicar un comentario