2016-04-04 14 views
2

Ich möchte den Prozessspeicher auf qnx bekommen. Auf einer Shell kann ich das Ergebnis mit dem Befehl showmem -P pid erhalten. In c öffne ich eine Pipe für den Befehl, aber dann möchte ich die Ausgabe des Befehls analysieren, aber ich weiß nicht, wie es gemacht wird.Wie bekomme ich Prozessspeicher auf qnx

int main() 
{ 
    pid_t self; 
    FILE *fp; 
    char *command; 
    self=getpid(); 

    sprintf(command,"showmem -P %d",self); 
    fp = popen(command,"r"); 
    // Then I want to read the elements that results from this command line 
} 
+1

Sie könnten mit tatsächlich gestartet werden soll das Zuweisen von Speicher für die Zeichenfolge des Befehls, so haben Sie nicht * undefined Verhalten * mit dem nicht initialisierten Zeiger 'Befehl'. Ein Array wäre eine gute Idee. –

+1

Was Ihr Problem anbetrifft, die Ausgabe des Befehls zu analysieren, könnte es eine gute Idee sein, [über die 'popen' Funktion zu lesen] (http://pubs.opengroup.org/onlinepubs/9699919799/functions/popen.html) . Sobald Sie das getan haben, sollten Sie hoffentlich wissen, wie man die Befehlsausgabe liest. Und wie können wir helfen, wenn wir unsere Hilfe fragen, wenn wir nicht wirklich wissen, wie die Ausgabe aussieht? –

+0

Ich konnte den Speicher mit fscanf abrufen – Bionix1441

Antwort

2

Ihre Idee mit dem Popen und Showmem ist machbar. Sie müssen das Ergebnis nur aus dem popen() analysieren, um die Speicherinformation zu extrahieren. Hier

ist ein Beispiel, vorausgesetzt, Sie sind nicht gemeinsam genutzte Objekte haben:

int main(int argc, char *argv[]) { 
    pid_t self; 
    FILE *fp; 
    char command[30]; 
    const int MAX_BUFFER = 2048; 
    char buffer[MAX_BUFFER]; 
    char* p; 
    char* delims = { " ," }; 
    int memory[] = {-1, -1, -1, -1, -1 }; 
    int valueindex = -1; 
    int parserindex = 0; 
    self = getpid(); 
    sprintf(command, "showmem -P %d", self); 

    fp = popen(command, "r"); 
    if (fp) { 
     while (!feof(fp)) { 
      if (fgets(buffer, MAX_BUFFER, fp) != NULL) { 
       p = strtok(buffer, delims); 
       while (p != NULL) { 
        if (parserindex >=8 && parserindex <= 13) { 
         memory[++valueindex] = atoi(p); 
        } 
        p = strtok(NULL, delims); 
        parserindex +=1; 
       } 
      } 
     } 
     pclose(fp); 
    } 

    printf("Memory Information:\n"); 
    printf("Total: %i\n", memory[0]); 
    printf("Code: %i\n", memory[1]); 
    printf("Data: %i\n", memory[2]); 
    printf("Heap: %i\n", memory[3]); 
    printf("Stack: %i\n", memory[4]); 
    printf("Other: %i\n", memory[5]); 
    return EXIT_SUCCESS; 
} 

Dieses Programm erzeugt die folgende Ausgabe:

Memory Information: 
Total: 851968 
Code: 741376 
Data: 24576 
Heap: 73728 
Stack: 12288 
Other: 0