Наблюдать за процессом неизвестного PID (без пользовательского интерфейса) - PullRequest
1 голос
/ 18 мая 2011

Я нашел этот вопрос, но даже когда он близок к тому, что мне нужно, он бесполезен

По сути, у меня есть приложение, которое должно что-то делать, когда другой процесс (с известным именем) запущен и / или завершен, но у меня нет PID, поэтому я не могу установить kqueue для его поиска .

Я мог бы сделать какое-то время для команды "ps aux | grep processstolook | grep -v grep", но это мое последнее средство.

Есть идеи?

Ответы [ 3 ]

2 голосов
/ 18 мая 2011

Посмотрите на этот ответ: Определите информацию о процессе программно в Darwin / OSX .Заголовочный файл libproc.h имеет proc_listpids, который даст вам все pids.Затем вы можете получить информацию о pid в цикле и, используя proc_pidinfo, проверить имя.Глядя на верхний источник, как предполагалось, также может быть полезным.(Текущий вариант находится здесь http://www.opensource.apple.com/source/top/top-67/.)

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

Лучшим способом может быть написание нового Processstolook, который просто вызывает старый, который вы можете переместить или переименовать. Затем он может уведомитьВы запускаете и останавливаете процесс. Это возможно?

1 голос
/ 18 мая 2011

Если имя целевого процесса / программы, для которого требуется PID, - «processstolook», то вы можете использовать команду pidof, чтобы получить PID этой запущенной программы.

pidof processtolook

посмотрите руководство pidof. Это часть пакета sysvinit-tools.

EDIT1: Посмотрите на этот код, который я нашел: http://programming -in-linux.blogspot.com / 2008/03 / get-process-id-by-name-in-c.html

Это может помочь вам получить план.

0 голосов
/ 18 мая 2011

В BSD вы можете использовать kvm_openfiles и kvm_getprocs, чтобы реализовать то, что вы хотите. Я не знаю, доступно ли это на OSX. Если у вас есть программа pgrep, посмотрите, как она реализована (src / bin / pkill.c).

...