C中当前进程的内存使用情况

我需要在C中获取当前进程的内存使用情况。有人可以提供一个代码示例,说明如何在Linux平台上执行此操作。

我知道获取内存使用的cat /proc/<your pid>/status方法,但我不知道如何在C中捕获它。

顺便说一句,这是我正在修改的PHP扩展(授予,我是一个C新手)。 如果PHP扩展API中有可用的快捷方式,那将更有帮助。

Solutions Collecting From Web of "C中当前进程的内存使用情况"

您可以随时打开/proc系统中的“文件”,就像使用常规文件一样(使用“self”符号链接,因此您不必查找自己的pid):

 FILE* status = fopen( "/proc/self/status", "r" ); 

当然,你现在必须解析文件来挑选你需要的信息。

getrusage库函数返回一个包含大量关于当前进程的数据的结构,包括:

 long ru_ixrss; /* integral shared memory size */ long ru_idrss; /* integral unshared data size */ long ru_isrss; /* integral unshared stack size */ 

但是,最新的linux文档说到这三个领域

 (unmaintained) This field is currently unused on Linux 

见getrusage(2)

这是一个非常丑陋的,不可移植的获取内存使用情况的方式,但是由于getrusage()的内存跟踪在Linux上本质上是无用的,读取/ proc // statm是我知道在Linux上获取信息的唯一方法。

如果有人知道更清洁,或者最好是更多的跨Unix跟踪内存使用的方式,我会非常感兴趣的学习如何。

 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); } 

从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) 
 #include <sys/resource.h> #include <errno.h> errno = 0; struct rusage* memory = malloc(sizeof(struct rusage)); getrusage(RUSAGE_SELF, memory); if(errno == EFAULT) printf("Error: EFAULT\n"); else if(errno == EINVAL) printf("Error: EINVAL\n"); printf("Usage: %ld\n", memory->ru_ixrss); printf("Usage: %ld\n", memory->ru_isrss); printf("Usage: %ld\n", memory->ru_idrss); printf("Max: %ld\n", memory->ru_maxrss); 

我使用这个代码,但由于某种原因,我得到0所有4 printf()

我碰到这个帖子: http : //appcrawler.com/wordpress/2013/05/13/simple-example-of-tracking-memory-using-getrusage/

简化版本:

 #include <sys/resource.h> #include <stdio.h> int main() { struct rusage r_usage; getrusage(RUSAGE_SELF,&r_usage); printf("Memory usage: %ld bytes\n",r_usage.ru_maxrss); return 0; } 

(在Linux 3.13中测试)

上面的结构来自4.3BSD Reno。 在Linux下并不是所有的字段都是有意义的。 在Linux 2.4中,只保留ru_utime,ru_stime,ru_minflt和ru_majflt字段。 由于Linux 2.6,ru_nvcsw和ru_nivcsw也被维护。

http://www.atarininja.org/index.py/tags/code

我迟到了,但是这可能会有助于任何其他人在linux上寻找常驻和虚拟(以及他们的峰值)的记忆。

这可能是非常可怕的,但它完成了工作。

 #include <stdio.h> #include <stdlib.h> #include <string.h> /* * Measures the current (and peak) resident and virtual memories * usage of your linux C process, in kB */ void getMemory( int* currRealMem, int* peakRealMem, int* currVirtMem, int* peakVirtMem) { // stores each word in status file char buffer[1024] = ""; // linux file contains this-process info FILE* file = fopen("/proc/self/status", "r"); // read the entire file while (fscanf(file, " %1023s", buffer) == 1) { if (strcmp(buffer, "VmRSS:") == 0) { fscanf(file, " %d", currRealMem); } if (strcmp(buffer, "VmHWM:") == 0) { fscanf(file, " %d", peakRealMem); } if (strcmp(buffer, "VmSize:") == 0) { fscanf(file, " %d", currVirtMem); } if (strcmp(buffer, "VmPeak:") == 0) { fscanf(file, " %d", peakVirtMem); } } fclose(file); }