Anda selalu dapat membuka 'file' di /proc
sistem seperti yang Anda lakukan pada file biasa (menggunakan symlink 'self' sehingga Anda tidak perlu mencari pid Anda sendiri):
FILE* status = fopen( "/proc/self/status", "r" );
Tentu saja, Anda sekarang harus mengurai file untuk memilih informasi yang Anda perlukan.
Saya menemukan posting ini:http://appcrawler.com/wordpress/2013/05/13/simple-example-of-tracking-memory-using-getrusage/
Versi sederhana:
#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;
}
(diuji di Linux 3.13)
Ini adalah cara yang sangat jelek dan tidak portabel untuk mendapatkan penggunaan memori, tetapi karena pelacakan memori getrusage() pada dasarnya tidak berguna di Linux, membaca /proc/
Jika ada yang mengetahui cara yang lebih bersih, atau lebih disukai lintas-Unix untuk melacak penggunaan memori, saya akan sangat tertarik untuk mempelajari caranya.
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);
}
Dari halaman manual 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
fungsi perpustakaan mengembalikan struktur yang berisi banyak sekali data tentang proses saat ini, termasuk ini:
long ru_ixrss; /* integral shared memory size */
long ru_idrss; /* integral unshared data size */
long ru_isrss; /* integral unshared stack size */
Namun, dokumentasi linux terbaru mengatakan tentang 3 bidang ini
(unmaintained) This field is currently unused on Linux
yang kemudian didefinisikan oleh manual sebagai:
Tidak semua bidang selesai; bidang yang tidak terawat diatur ke nol oleh kernel. (Kolom yang tidak terpelihara disediakan untuk kompatibilitas dengan sistem lain, dan karena mungkin suatu hari nanti akan didukung di Linux.)
Lihat getrusage(2)