Я пытаюсь обнаружить, когда конкретные приложения запущены.
В настоящее время я использую NSWorkspace
, регистрация для "действительно запускала приложение" уведомление. Я также использую runningApplications
метод для получения приложений, которые в настоящее время работают, когда мое приложение запускается.
Для большинства приложений название комплекта приложений достаточно. У меня есть plist "известных приложений", которые я перепроверяю с названием этого, передал в уведомлении.
Это хорошо работает, пока Вы не сталкиваетесь с приложением, которое действует как прокси для запуска другого приложения с помощью параметров командной строки.
Пример: недавно выпущенный Портал на Mac не имеет специализированного комплекта приложений. Пар может создать ярлык, который служит не чем иным как запускаться hl2_osx
приложение с -game
аргумент и portal
поскольку это - параметр.
Так как больше основанных на источнике игр направляется в Mac, я предполагаю, что они будут использовать тот же метод для запуска, эффективно работая hl2_osx
приложение с -game
аргумент.
Существует ли хороший способ получить список аргументов (и их параметры) использование Какао API?
NSProcessInfo
приближается, предлагая 'метод '-аргументов, но только предоставляет информацию для ее собственного процесса...
NSRunningApplication
предлагает способность получить информацию о произвольных приложениях с помощью PID, но никакой командной строки args...
Есть ли что-нибудь, что заполняет разрыв между двумя?
Я пытаюсь не спуститься по маршруту порождения NSTask
работать ps -p [pid]
и парсинг вывода... Я предпочел бы что-то больше высокого уровня.
Вы можете использовать все, что использует 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 «Наблюдение за временем жизни процесса без опроса» также может быть вам полезен.
Нет, лучше всего использовать ps
. Стандартные интерфейсы информации о процессах не поддерживаются в OS X (версии noop были предоставлены в OS X 10.4, но впоследствии были удалены), а частные интерфейсы, вероятно, будут меняться между версиями OS X.
Если вы хотите ограничиться одной версией OS X, доступен весь исходный код, например, для ps или libproc ; вам также нужно будет запустить его как root.