Sie können die 'Dateien' immer einfach im /proc
öffnen system wie eine normale Datei (unter Verwendung des 'self'-Symlinks, damit Sie Ihre eigene PID nicht nachschlagen müssen):
FILE* status = fopen( "/proc/self/status", "r" );
Natürlich müssen Sie die Datei jetzt parsen, um die benötigten Informationen herauszusuchen.
Ich bin auf diesen Beitrag gestoßen:http://appcrawler.com/wordpress/2013/05/13/simple-example-of-tracking-memory-using-getrusage/
Vereinfachte Version:
#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;
}
(getestet unter Linux 3.13)
Dies ist eine schrecklich hässliche und nicht tragbare Methode, um die Speichernutzung zu ermitteln, aber da die Speicherverfolgung von getrusage() unter Linux im Wesentlichen nutzlos ist, ist das Lesen von /proc/
Wenn irgendjemand sauberere oder besser Unix-übergreifende Methoden zum Verfolgen der Speichernutzung kennt, wäre ich sehr daran interessiert, zu erfahren, wie.
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);
}
Von der proc(5) Manpage:
/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)
Die getrusage
Die Bibliotheksfunktion gibt eine Struktur zurück, die eine ganze Menge Daten über den aktuellen Prozess enthält, einschließlich dieser:
long ru_ixrss; /* integral shared memory size */
long ru_idrss; /* integral unshared data size */
long ru_isrss; /* integral unshared stack size */
Die aktuellste Linux-Dokumentation sagt jedoch über diese 3 Felder
(unmaintained) This field is currently unused on Linux
die das Handbuch dann definiert als:
Nicht alle Felder sind ausgefüllt; Nicht verwaltete Felder werden vom Kernel auf Null gesetzt. (Die ungepflegten Felder werden aus Gründen der Kompatibilität mit anderen Systemen bereitgestellt und weil sie eines Tages unter Linux unterstützt werden könnten.)
Siehe getrusage(2)