Экспорт состояния программы в procfs? - PullRequest
5 голосов
/ 19 ноября 2011

Могу ли я создать какие-либо сопоставления файлов в procfs для отражения внутреннего состояния моей программы?

Например,

main.c:

char *message;

...

Предположим, что pid равен 1200, возможно ли создатьвременный файл / proc / 1200 / variable / message, который будет отражать переменную сообщения?

Я думаю, мне нужно работать с proc fs, так как есть /proc/.../ndomnet, fd,задача и т. д.}, с чего начать, если я хочу добавить еще одну переменную / раздел в proc fs?

Ответы [ 4 ]

4 голосов
/ 19 ноября 2011

Нет инструментов для того, что вы хотите выполнить.

Есть некоторые вещи, которые close - gdb(1) знает, как анализировать программы, которые работают, и отображать значениянекоторых переменных (не все переменные остаются в процессе компиляции - хотя флаг debug -g помогает gdb(1) выяснить, что оптимизации могли сделать с вашей программой).

Проект FUSE делает этодля программ пользовательского пространства возможно предоставить файловую систему другим процессам через ядро.Вы можете либо напрямую использовать FUSE для экспорта выбранных переменных из вашей программы, либо попробовать что-то значительно более амбициозное и написать инструменты для инкапсуляции способностей самоанализа gdb(1) с возможностями публикации FUSE и предоставить эту услугу всему миру.

Вы также можете изучить использование 9p в своих программах - это по духу похоже на FUSE, позволяя программам предоставлять интерфейсы к своим функциям через интерфейсы файловой системы.(Вы можете увидеть его в использовании в wmii оконном менеджере , где удивительный объем управления оконным менеджером возможен через интерфейсы файловой системы, что позволяет легко программировать с использованием любого языка, который вам нравится.) Вы могли быОпять же, интегрируйте это с способностями самоанализа gdb(1), чтобы попытаться обеспечить это.

Я ожидаю, что такой проект будет достойным старшего проекта или проекта аспирантуры - не то, что будет выполненобыстро.

3 голосов
/ 19 ноября 2011

Вместо использования /proc вы можете использовать именованный канал.

Создайте fifo, используя mkfifo, и ваша программа откроет его для записи.Либо в выделенном потоке, либо в асинхронном режиме ваша программа генерирует текст, когда кто-то запускает cat your-pipe в оболочке.cat открывает именованный канал для чтения, конечно.

По сути, это имитирует интерфейс cat /proc/...., но вместо того, чтобы модуль ядра реализовывал генерацию текста, у вас есть программа, реализующая его.

3 голосов
/ 19 ноября 2011

Вообще говоря, вы не можете сделать это только из пользовательского пространства. procfs - это ядро, сообщающее вам о своем состоянии процесса. Так что, если вы хотите сделать что-то подобное, вы бы

а) должен создать модуль ядра, который позволит вам передавать контент обратно на него б) инициировать поиск контента через какой-либо сигнал.

Итак, если вы ДЕЙСТВИТЕЛЬНО хотите это сделать. Я бы предложил следующий путь:

1) Напишите модуль ядра, который может сообщать о состоянии программы. Давайте назовем это kpsmod для нашего обсуждения.

2) Обеспечить связь с пользовательским пространством или с пользовательским процессом через некоторый механизм (скажем, через сетевую связь), чтобы инициировать некоторый процесс регистрации, который регистрирует адреса переменных. Пользовательская программа сообщает модулю, что она заинтересована в «экспорте» себя по сигналу (скажем, SIGHUP или SIGUSR1); сделать это программируемым тоже. Передайте имя, адрес и размеры для чтения (с информацией о типе, если это необходимо). Если переменная находится в стеке, она должна быть отклонена. Для этого допускаются только общедоступные символы (для простоты)

3) Вы даже можете подумать о доступе к стеку ptrace для процесса во время proc_read определенной переменной.

4) тогда модуль ядра должен создать / proc / kpsmod // vars * для каждой переменной и когда эта переменная читается

5) при чтении выдает содержимое памяти через proc (возможно, отформатированный)

и вуаля :-) у вас есть желаемый эффект.

1 голос
/ 19 ноября 2011

Вы не можете, если вы не пишете модуль ядра

...