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