Подтвердить что ты не робот

Использование памяти текущего процесса в C

Мне нужно получить использование памяти текущего процесса в C. Может ли кто-нибудь предложить пример кода, как это сделать на платформе Linux?

Мне известно о методе cat /proc/<your pid>/status для использования памяти, но я понятия не имею, как записать это в C.

BTW, это для расширения PHP, которое я изменяю (предоставлено, я новичок C). Если в API-интерфейсе PHP есть ярлыки, это будет еще более полезно.

4b9b3361

Ответ 1

Вы всегда можете просто открыть "файлы" в системе /proc, как и обычный файл (используя символическую ссылку "self", чтобы вам не пришлось искать свой собственный pid):

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

Конечно, теперь вам нужно проанализировать файл, чтобы выбрать нужную вам информацию.

Ответ 2

Функция библиотеки getrusage возвращает структуру, содержащую множество данных о текущем процессе, включая следующие:

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

Однако в самой современной документации linux говорится об этих 3 полях

(unmaintained) This field is currently unused on Linux

который руководство затем определяет как:

Не все поля заполнены; не поддерживаемые поля устанавливаются в ноль ядром. (Необслуживаемые поля предусмотрены для совместимости с другими системами и потому что однажды они могут быть поддержаны в Linux.)

Смотрите getrusage (2)

Ответ 3

Это ужасно уродливый и не переносимый способ использования памяти, но поскольку отслеживание памяти 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)

Ответ 4

#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()

Ответ 5

Я наткнулся на этот пост: 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);
  // Print the maximum resident set size used (in kilobytes).
  printf("Memory usage: %ld kilobytes\n",r_usage.ru_maxrss);
  return 0;
}

(протестировано в Linux 3.13)

Ответ 6

Я опаздываю на вечеринку, но это может быть полезно для всех, кто ищет резидентные и виртуальные (и их пиковые значения до сих пор) воспоминания о 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);
}

Ответ 7

Вышеупомянутая структура была взята из 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