Ответ 1
Solaris имеет pldd
. Для Linux вы можете вызвать ldd
в исполняемом файле или pmap
в запущенном процессе или просмотрите /proc/PID/maps
для отображаемых библиотек.
Мне нужно узнать, какие библиотеки загрузил unix-процесс и может ли он использовать его всю жизнь. Возможно ли это и как. Или еще лучше, у меня есть имя библиотеки, и мне нужно выяснить, какие процессы используют его, возможно ли это.
В том же примечании можно ли получить уведомление о том, как при запуске процесса unix и при его завершении. Они не будут дочерними процессами моего процесса, мне просто нужно знать глобально.
Update:
Думаю, я не дал достаточно информации. Unix, о котором я говорил, был MacOS X (хотя некоторые говорят, что он не совсем полностью unix), и я искал способ найти загруженные библиотеки, которые есть у процесса, и мне нужно сделать это на C/С++.
Solaris имеет pldd
. Для Linux вы можете вызвать ldd
в исполняемом файле или pmap
в запущенном процессе или просмотрите /proc/PID/maps
для отображаемых библиотек.
Если lsof не установлен, вы можете просто cat/proc/$pid/maps
вы также можете проверить исполняемые файлы на диске с помощью ldd, чтобы узнать, какие библиотеки они будут открывать (но это не показывает динамические библиотеки, открытые с помощью dlopen()).
Что касается мониторинга новых процессов, вы можете добавить inotify watch в /proc для мониторинга создания/уничтожения новых числовых каталогов.
Обновление: inotify on/proc не работает, но есть, по-видимому, альтернативы, см. this thread
В Mac OS X вы можете использовать vmmap $pid
, чтобы получить список отображаемых областей памяти для процесса. Это показывает все загруженные библиотеки (по крайней мере, это работает для меня здесь 10.7.5).
ps -A
предоставит вам список всех процессов, поэтому ps -A | grep $APPNAME
предоставит вам ваш идентификатор процесса $pid для использования с vmmap $pid
. lsof -p $pid
также работает.
Вопрос, похоже, требует динамического метода из С++. Вы можете опросить эти команды и проанализировать результаты, хотя вы можете пропустить быстрые события загрузки/выгрузки.
lsof
- это программное обеспечение с открытым исходным кодом под лицензией BSD. Его исходный код, без сомнения, дает некоторое представление о том, как это сделать с C/С++. См.: http://en.wikipedia.org/wiki/Lsof
вы можете использовать lsof. См. Справочную страницу для получения дополнительной информации. Другим инструментом является strace
. Чтобы узнать, запущен ли процесс, вы можете использовать ps -ef
с номером grep
или с инструментами вроде pgrep
. проверьте, чтобы возвращаемое значение знало, если оно завершено или нет.
Я пытаюсь (и не могу) сделать это. Посмотрите на mach_vm_read и vm_region_recurse_64. Приложения с закрытым исходным кодом, такие как vmmap и Apple Crash Reporter, также используют эти методы, а также GDB с открытым исходным кодом. Вы можете попробовать найти ответ, но источник сложно прочитать.
В OS X просто нужно установить DYLD_PRINT_LIBRARIES
export DYLD_PRINT_LIBRARIES=1
./your_process
У меня нет конкретного ответа, который вы ищете, но у меня есть что-то близкое, что, возможно, приблизит вас к тому, что вы хотите. Вы можете отобразить связанную библиотеку определенного двоичного файла (а не процесса) с помощью:
Пример:
chris$ otool -L /usr/local/bin/mtr
mtr:
/usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 159.1.0)
/usr/lib/libncurses.5.4.dylib (compatibility version 5.4.0, current version 5.4.0)
/usr/lib/libresolv.9.dylib (compatibility version 1.0.0, current version 46.1.0)