Как найти все адреса памяти для чтения и записи процесса в Linux/UNIX с языком C/C++?

Через файловую систему /proc возможно чтение сопоставлений памяти с помощью /proc/PID_PROCESS/maps , но есть ли какие-либо собственные API, предназначенные для этой функции в C/C++?

то есть узнать адрес памяти, доступный для записи и чтения для процесса с PID 9322:

%> awk -F "-| " '$3 ~ /rw/ { print $1 " " $2}' /proc/9322/maps
0804e000 0804f000
085ed000 0860e000
b7707000 b7708000
b7864000 b7865000
b7865000 b7868000
b7897000 b7898000
b78b6000 b78b7000
bfd2e000 bfd50000

И эти адреса передаются в мою программу, но теперь я хочу интегрировать эту функцию непосредственно в свою программу на C++.

Для большей эффективности, если я хочу поддерживать другую *BSD-систему, я не смогу воспользоваться преимуществами системы /proc, и я думаю, что должен быть какой-то метод для создания, например, /proc/1/maps напрямую, без повторного чтения их там , поправьте, если ошибаюсь ^_^


person daisy    schedule 17.02.2011    source источник


Ответы (4)


Прочитайте файл proc, как вы читаете обычный файл.

eg.

  FILE *filep = fopen("/proc/9322/maps","r");
  char ch;
  while (ch != EOF){
    ch = fgetc(filep);
    printf("%c", ch);
  }
person Zimbabao    schedule 17.02.2011
comment
Спасибо, Зим, но есть ли нативные API, которые мне не нужны для разбора файловой системы /proc? Поскольку в некоторых системах BSD UNIX нет файловой системы /proc, я был бы счастлив, если бы моя программа была переносима в большинство систем *BSD ;-P - person daisy; 17.02.2011
comment
Насколько я знаю, для этого нет собственного API. Вы можете написать парсер для каждого BSD, Linux и выборочно скомпилировать с использованием флагов. - person Zimbabao; 17.02.2011
comment
Конечно, и я реализовал один с простым чтением и разбором файлов, я считаю этот ответ лучшим на данный момент. - person daisy; 29.03.2011

Ну, вы можете получить PID процесса, используя:

pid_t pid = getpid();

Затем вы можете открыть файл /proc/PID/maps и разобрать его в массив, чтобы определить, какие наборы памяти доступны для чтения и записи.

Изменить: для функции getpid() требуется #include <unistd.h>.

person jwir3    schedule 17.02.2011

К сожалению, нет полной библиотеки (насколько мне известно), чтобы делать то, что вы хотите здесь. Существует libproc как часть procps, однако это внутренний API, и, кроме того, вероятно, только реализует функциональность, используемую procps. Конечно, было бы неплохо, если бы была такая библиотека — не стесняйтесь выпускать ее! - но на данный момент вам придется выполнять условную компиляцию для каждой ОС, на которую вы ориентируетесь, и использовать API-интерфейсы, специфичные для ОС (для Linux, напрямую открывая и читая соответствующие procfiles).

person bdonlan    schedule 17.02.2011
comment
Спасибо за ответ на этот вопрос, я действительно не пробовал libproc, но вы правы, я должен попытаться выпустить его ;-P - person daisy; 29.03.2011