Vous pouvez toujours simplement ouvrir les 'fichiers' dans le /proc
system comme vous le feriez avec un fichier normal (en utilisant le lien symbolique 'self' pour ne pas avoir à chercher votre propre pid):
FILE* status = fopen( "/proc/self/status", "r" );
Bien sûr, vous devez maintenant analyser le fichier pour sélectionner les informations dont vous avez besoin.
Je suis tombé sur ce post :http://appcrawler.com/wordpress/2013/05/13/simple-example-of-tracking-memory-using-getrusage/
Version simplifiée :
#include <sys/resource.h>
#include <stdio.h>
int main() {
struct rusage r_usage;
getrusage(RUSAGE_SELF,&r_usage);
// Print the maximum resident set size used (in kilobytes).
printf("Memory usage: %ld kilobytes\n",r_usage.ru_maxrss);
return 0;
}
(testé sous Linux 3.13)
C'est un moyen terriblement moche et non portable d'obtenir l'utilisation de la mémoire, mais comme le suivi de la mémoire de getrusage() est essentiellement inutile sous Linux, lire /proc/
Si quelqu'un connaît des moyens plus propres, ou de préférence plus inter-Unix, de suivre l'utilisation de la mémoire, je serais très intéressé à savoir comment.
typedef struct {
unsigned long size,resident,share,text,lib,data,dt;
} statm_t;
void read_off_memory_status(statm_t& result)
{
unsigned long dummy;
const char* statm_path = "/proc/self/statm";
FILE *f = fopen(statm_path,"r");
if(!f){
perror(statm_path);
abort();
}
if(7 != fscanf(f,"%ld %ld %ld %ld %ld %ld %ld",
&result.size,&result.resident,&result.share,&result.text,&result.lib,&result.data,&result.dt))
{
perror(statm_path);
abort();
}
fclose(f);
}
À partir de la page de manuel proc(5) :
/proc/[pid]/statm
Provides information about memory usage, measured in pages.
The columns are:
size total program size
(same as VmSize in /proc/[pid]/status)
resident resident set size
(same as VmRSS in /proc/[pid]/status)
share shared pages (from shared mappings)
text text (code)
lib library (unused in Linux 2.6)
data data + stack
dt dirty pages (unused in Linux 2.6)
Le getrusage
La fonction de bibliothèque renvoie une structure contenant un grand nombre de données sur le processus en cours, notamment celles-ci :
long ru_ixrss; /* integral shared memory size */
long ru_idrss; /* integral unshared data size */
long ru_isrss; /* integral unshared stack size */
Cependant, la documentation Linux la plus récente parle de ces 3 champs
(unmaintained) This field is currently unused on Linux
que le manuel définit alors comme :
Tous les champs ne sont pas remplis ; les champs non maintenus sont mis à zéro par le noyau. (Les champs non maintenus sont fournis pour la compatibilité avec d'autres systèmes, et parce qu'ils pourraient un jour être pris en charge sous Linux.)
Voir getrusage(2)