osx - как программно получить идентификатор процесса (PID)?

Как я могу получить идентификатор процесса? Мне нужен идентификатор, чтобы убить этот процесс. Я знаю название процесса.

Спасибо!


person Andrei    schedule 02.06.2011    source источник
comment
Мы говорим о каком-то процессе или о вашем приложении?   -  person Deepak Danduprolu    schedule 02.06.2011
comment
Любой процесс. Для вашего собственного приложения довольно просто получить PID с помощью getpid   -  person Andrei    schedule 02.06.2011


Ответы (4)


Лучший подход - использовать - [NSWorkspace createdApplications] для приложений 10.5 и - [NSWorkspace runningApplicattions] для приложений 10.6+. Один возвращает словарь с указанными ключами, включая идентификатор процесса, имя пакета и информацию о местоположении (если доступно), другой - NSRunningApplication.

person nomothetis    schedule 02.06.2011
comment
А почему лучше? В конце концов, он по-прежнему перейдет к API уровня C. Итак, если у вас уже есть программа на C, зачем вообще использовать Objective-C? - person ; 02.06.2011
comment
Только лучше, если вы работаете в приложении Objective-C; это разумное предположение, когда люди ищут программную помощь в OS X. На простом C простая библиотека C, очевидно, лучше. К сожалению, это заняло так много времени - я не получил письмо по электронной почте с комментарием. - person nomothetis; 13.09.2011

Во-первых, имя процесса не однозначно идентифицирует процесс. Может быть много процессов с одним и тем же именем, или процессы могут даже изменять свое имя, как вы их видите (т.е. сервер PostgreSQL разветвляет и изменяет argv [0], чтобы вы могли видеть, кто главный, кто рабочий процесс и т. Д.). Но в любом случае вам понадобится API для перечисления процессов и получения их сведений - procps сделает это за вас.

ОБНОВЛЕНИЕ: О, я не заметил OSX в первый раз. Для OS X вы должны использовать NetBSD API (не спрашивайте). См. KVM (Библиотека доступа к данным ядра) документация. API другой, идея все та же.

person Community    schedule 02.06.2011
comment
NetBSD ?! Разве OS X не является ядром FreeBSD и Mach? - person JustSid; 02.06.2011
comment
Может быть FreeBSD. Все, что я знаю, это то, что этот API похож на то, что есть в NetBSD, возможно, во FreeBSD есть то же самое. - person ; 02.06.2011

Быстрый взлом: создайте вызов оболочки для killall, который убивает процесс по имени.

person Jens    schedule 02.06.2011

Используйте 1_

NSArray *runningApplications = [NSRunningApplication runningApplicationsWithBundleIdentifier:@"com.bundleIdentifier"];
if (runningApplications.count == 1) {
    NSRunningApplication *app = runningApplications[0];
    pid = [app processIdentifier];
}

Примечание. -[NSWorkspace launchedApplications] не рекомендуется для версии 10.6 и более поздних версий.

person zaph    schedule 22.07.2013
comment
от Apple: NSRunningApplication - это класс для управления и предоставления информации для одного экземпляра приложения. Отслеживаются только пользовательские приложения; это не предоставляет информацию обо всех процессах в системе. - person Jeff Brown; 03.10.2016