Mac OS X: получение подробной информации о процессе (в частности, его аргументах запуска) для произвольно запущенных приложений с использованием его PID - PullRequest
7 голосов
/ 15 мая 2010

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

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

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

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

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

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

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

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

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

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

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

Ответы [ 2 ]

8 голосов
/ 15 мая 2010

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

Использование sysctl в ps кажется менее значимым для вашей цели; он используется для получения другой информации, такой как идентификатор группы и идентификатор родительского процесса. Конкретное имя sysctl используется {CTL_KERN, KERN_PROC, KERN_PROC_<em>which</em>, <em>flags</em>}, где , который указывает фильтр процесса (например, ALL, PID), а flags являются аргументами для фильтра (подробности приведены в справочная страница sysctl).

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

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

4 голосов
/ 15 мая 2010

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

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

...