wake-up-neo.com

Speicherbelegung des aktuellen Prozesses in C

Ich brauche die Speicherbelegung des aktuellen Prozesses in C. Kann jemand ein Codebeispiel dazu anbieten, wie dies auf einer Linux-Plattform zu tun ist?

Mir ist die cat /proc/<your pid>/status-Methode bekannt, mit der die Speicherauslastung abgerufen wird, aber ich habe keine Ahnung, wie ich das in C erfassen sollte.

Übrigens, es ist für eine PHP Erweiterung, die ich modifiziere (selbstverständlich, ich bin ein C-Neuling). Wenn innerhalb der Erweiterungs-API PHP Verknüpfungen verfügbar sind, wäre dies noch hilfreicher.

19
scotts

Sie können die 'Dateien' im /proc-System immer wie eine normale Datei öffnen (mithilfe des 'Self'-Symbols, damit Sie nicht nach Ihrer eigenen PID suchen müssen):

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

Natürlich müssen Sie jetzt die Datei analysieren, um die benötigten Informationen auszuwählen.

25
CB Bailey

Die Bibliotheksfunktion getrusage gibt eine Struktur zurück, die eine ganze Reihe von Daten über den aktuellen Prozess enthält, einschließlich der folgenden:

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 aus

(unmaintained) This field is currently unused on Linux

Siehe getrusage (2)

24
caf

Dies ist eine schrecklich hässliche und nicht tragbare Möglichkeit, die Speichernutzung zu erhalten, aber da die Speicherortung von getrusage () unter Linux im Wesentlichen unbrauchbar ist, ist das Lesen von/proc // statm die einzige Möglichkeit, Informationen über Linux zu erhalten .

Wenn jemand von Cleaner-Methoden oder vorzugsweise mehr Cross-Unix-Methoden zum Nachverfolgen der Speichernutzung weiß, wäre ich sehr daran interessiert, 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);
}

Aus der proc (5) man-Seite:

   /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)
12
James
#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);

Ich habe diesen Code verwendet, aber aus irgendeinem Grund bekomme ich für alle 4 printf () die ganze Zeit 0.

7
Jeff

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 in Linux 3.13)

6
lepe

Ich bin zu spät zur Party, aber dies könnte für alle anderen hilfreich sein, die nach den residenten und virtuellen (und ihren bisherigen Spitzenwerten) auf Linux suchen.

Es ist wahrscheinlich ziemlich schrecklich, aber es erledigt die Arbeit.

#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);
}
4
Anti Earth

Die obige Struktur wurde von 4.3BSD Reno übernommen. Unter Linux sind nicht alle Felder gemeint - . In Linux 2.4 werden nur die Felder ru_utime, ru_stime, Ru_minflt und ru_majflt beibehalten. Seit Linux 2.6 werden auch ru_nvcsw und Ru_nivcsw beibehalten.

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

0
mellthy