Vždy můžete pouze otevřít 'soubory' v /proc
systém jako běžný soubor (pomocí symbolického odkazu 'self', takže nemusíte hledat své vlastní pid):
FILE* status = fopen( "/proc/self/status", "r" );
Samozřejmě nyní musíte soubor analyzovat, abyste vybrali informace, které potřebujete.
Narazil jsem na tento příspěvek:http://appcrawler.com/wordpress/2013/05/13/simple-example-of-tracking-memory-using-getrusage/
Zjednodušená verze:
#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;
}
(testováno v Linuxu 3.13)
Toto je strašně ošklivý a nepřenosný způsob, jak získat využití paměti, ale protože sledování paměti getrusage() je v Linuxu v podstatě k ničemu, čtení /proc/
Pokud někdo zná čistší, nebo nejlépe více cross-Unix způsoby sledování využití paměti, velmi by mě zajímalo, jak na to.
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);
}
Z manuálové stránky 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)
getrusage
knihovní funkce vrací strukturu obsahující velké množství dat o aktuálním procesu, včetně těchto:
long ru_ixrss; /* integral shared memory size */
long ru_idrss; /* integral unshared data size */
long ru_isrss; /* integral unshared stack size */
Nicméně nejaktuálnější linuxová dokumentace hovoří o těchto 3 polích
(unmaintained) This field is currently unused on Linux
který pak manuál definuje jako:
Nejsou vyplněna všechna pole; neudržovaná pole jsou jádrem nastavena na nulu. (Neudržovaná pole jsou poskytnuta kvůli kompatibilitě s jinými systémy a proto, že jednoho dne mohou být podporována na Linuxu.)
Viz getrusage(2)