Search code examples
cqnxqnx-neutrino

How to get process memory on qnx


I would like to get the process memory on qnx. On a shell,I can get the result using the command showmem -P pid. In c I open a pipe for the command but then I would like to parse the output of the command but I don't know how is it done.

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
}

Solution

  • Your idea with the popen and showmem is feasible. You just have to parse the result from the popen() in order to extract the memory information.

    Here is an example, assuming you don't have shared objects:

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

    This program generates the following output:

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