Каков наилучший способ чтения из интерфейсов Linux / proc с использованием кода пространства пользователя C? - PullRequest
15 голосов
/ 19 марта 2012

Согласно man 5 proc, можно использовать файловую систему /proc для доступа к следующей информации в Linux:

   /proc/[pid]/maps
          A file containing the currently mapped memory regions and their access
          permissions.

          The format is:

          address           perms offset  dev   inode   pathname
          08048000-08056000 r-xp 00000000 03:0c 64593   /usr/sbin/gpm
          08056000-08058000 rw-p 0000d000 03:0c 64593   /usr/sbin/gpm
          08058000-0805b000 rwxp 00000000 00:00 0
          40000000-40013000 r-xp 00000000 03:0c 4165    /lib/ld-2.2.4.so
          40013000-40015000 rw-p 00012000 03:0c 4165    /lib/ld-2.2.4.so
          4001f000-40135000 r-xp 00000000 03:0c 45494   /lib/libc-2.2.4.so
          40135000-4013e000 rw-p 00115000 03:0c 45494   /lib/libc-2.2.4.so
          4013e000-40142000 rw-p 00000000 00:00 0
          bffff000-c0000000 rwxp 00000000 00:00 0

          where "address" is the address space in the process that it occupies,
          "perms" is a set of permissions:

               r = read
               w = write
               x = execute
               s = shared
               p = private (copy on write)

          "offset" is the offset into the file/whatever, "dev" is the device
          (major:minor), and "inode" is the inode on that device.  0 indicates
          that no inode is associated with the memory region, as the case would
          be with BSS (uninitialized data).

          Under Linux 2.0 there is no field giving pathname.

Я действительно не хочу писать текст для разбора текста на C; Я бы предпочел просто звонить в ОС и читать информацию прямо в структуры. Я посмотрел в /usr/include/linux, чтобы увидеть, была ли очевидная структура с API, но ничего не увидел.

Итак, вопрос из двух частей:

  1. Можно ли это считать "плохой идеей"? То есть, должны ли пользовательские программы просто кусать маркеры и читать текст из /proc в случае изменения интерфейсов ядра? Если да, то есть ли принятая «лучшая практика» для чтения из /proc с использованием C? (fscanf()? Регулярные выражения?)
  2. Как мне найти документацию для интерфейсов ядра (при условии, что они существуют), которая позволила бы мне напрямую читать эти данные? (Является ли сам источник ядра лучшим местом для запуска? Если да, то где в источнике ядра я должен искать?) Бонусные баллы, если вы знаете, какой интерфейс может предоставить данные /proc/[pid]/maps специально. =) * * 1 018

Ответы [ 3 ]

8 голосов
/ 19 марта 2012

Я думаю, что для сценариев perl или shell вполне нормально читать и анализировать / proc / data. В программе на C, если требуется устойчивость, я бы использовал интерфейс ядра (вероятно, sysctl).

Оказывается, что реализация pmap в комплекте разбирает /proc/PID/maps файлов построчно следующим образом (см. one_proc() функция):

sscanf(mapbuf,"%"KLF"x-%"KLF"x %31s %Lx %x:%x %Lu", &start, &end, flags, &file_offset, &dev_major, &dev_minor, &inode);

РЕДАКТИРОВАТЬ : в оригинальной версии моего ответа был показан способ анализа данных только в сегментах общей памяти, а не всех отображенных сегментов памяти в соответствии с желаемым OP.

Полагаю, ipcs -m даст вам одинаковые данные для нескольких процессов. Итак, ответ на ваш второй вопрос заключается в том, что вы должны прочитать код ipcs: (например, версия BSD , версия Linux ):

2 голосов
/ 19 марта 2012

Чтение последовательно текстовых псевдофайлов, таких как /proc/self/maps, является каноническим способом получения этой информации в Linux (и в противном случае нет простого способа получить ее; это способ, которым ядро ​​ее передает).

Вы можете использовать библиотеку (например, libproc), которая сделает это за вас.Но в конце концов ваше приложение будет анализировать (возможно, через некоторые библиотеки) файлы в /proc.Я не уверен, что вы правы, чтобы избежать этого.

Просто попробуйте выполнить команду типа ps или top с отключенным /proc.Это, вероятно, больше не будет работать.

1 голос
/ 19 марта 2012

libproc предоставляет удобный способ доступа к содержимому под /proc.

...