Mac OS X: Получение подробной информации процесса (конкретно ее аргументы запуска) для произвольных запущенных приложений с помощью ее PID

Я пытаюсь обнаружить, когда конкретные приложения запущены.

В настоящее время я использую NSWorkspace, регистрация для "действительно запускала приложение" уведомление. Я также использую runningApplications метод для получения приложений, которые в настоящее время работают, когда мое приложение запускается.

Для большинства приложений название комплекта приложений достаточно. У меня есть plist "известных приложений", которые я перепроверяю с названием этого, передал в уведомлении.

Это хорошо работает, пока Вы не сталкиваетесь с приложением, которое действует как прокси для запуска другого приложения с помощью параметров командной строки.

Пример: недавно выпущенный Портал на Mac не имеет специализированного комплекта приложений. Пар может создать ярлык, который служит не чем иным как запускаться hl2_osx приложение с -game аргумент и portal поскольку это - параметр.

Так как больше основанных на источнике игр направляется в Mac, я предполагаю, что они будут использовать тот же метод для запуска, эффективно работая hl2_osx приложение с -game аргумент.

Существует ли хороший способ получить список аргументов (и их параметры) использование Какао API?

NSProcessInfo приближается, предлагая 'метод '-аргументов, но только предоставляет информацию для ее собственного процесса...

NSRunningApplication предлагает способность получить информацию о произвольных приложениях с помощью PID, но никакой командной строки args...

Есть ли что-нибудь, что заполняет разрыв между двумя?

Я пытаюсь не спуститься по маршруту порождения NSTask работать ps -p [pid] и парсинг вывода... Я предпочел бы что-то больше высокого уровня.

7
задан Jasarien 14 May 2010 в 23:11
поделиться

2 ответа

Вы можете использовать все, что использует ps , хотя это не на основе какао. Согласно Сингху , ps основан на вызовах kvm и sysctl. Перелив к источнику , важные вызовы кажутся kvm_openfiles , kvm_getprocs и kvm_getargv . Чтобы получить аргументы командной строки, сначала вызовите kvm_openfiles , чтобы получить доступ к пространству памяти ядра, затем используйте kvm_getprocs для получения информации о процессе ядра, затем kvm_getargv .

Использование sysctl в ps кажется менее подходящим для вашей цели; он используется для получения другой информации, такой как идентификатор группы и идентификатор родительского процесса. Конкретное используемое имя sysctl - {CTL_KERN, KERN_PROC, KERN_PROC_ , которое , flags } , где которое определяет фильтр процесса (например, ВСЕ , PID ) и флаги являются аргументами для фильтра (подробности см. На странице руководства sysctl ).

OS X не поддерживает procfs, но Сингх разработал версию на основе FUSE , выпущенную под GPLv2.Если вы объедините его со своим приложением, вам также придется выпустить его под GPLv2. Большая часть MacFUSE выпущена под лицензией BSD , поэтому его можно распространять с вашим приложением, не делая его с открытым исходным кодом (fusefs / fuse_nodehash.c выпущен под лицензией Apple с открытым исходным кодом, но он также позволяет связывать в приложения с закрытым исходным кодом).

Вопрос « Получить argv другого процесса в OS X с использованием C » должен быть полезен, поскольку в нем есть пример кода с использованием kvm и sysctl. TN 2050 «Наблюдение за временем жизни процесса без опроса» также может быть вам полезен.

8
ответ дан 6 December 2019 в 21:11
поделиться

Нет, лучше всего использовать ps . Стандартные интерфейсы информации о процессах не поддерживаются в OS X (версии noop были предоставлены в OS X 10.4, но впоследствии были удалены), а частные интерфейсы, вероятно, будут меняться между версиями OS X.

Если вы хотите ограничиться одной версией OS X, доступен весь исходный код, например, для ps или libproc ; вам также нужно будет запустить его как root.

4
ответ дан 6 December 2019 в 21:11
поделиться