Как найти PID любого процесса в Mac OSX C++

Мне нужно найти PID определенной программы в Mac OSX с помощью С++ и сохранить его как переменную. Я искал ответ на этот вопрос некоторое время, и я не могу найти подробный или тот, который работает. Если у кого-то есть идеи, как это сделать, пожалуйста, ответьте. Спасибо!


person N T    schedule 27.03.2018    source источник
comment
Попробуйте ps -aef в Терминале. Затем выберите один процесс и попробуйте найти его, например. pgrep coreaudiod или pgrep USBAgent. Тогда, возможно, подумайте об использовании popen(), чтобы сделать то же самое из вашей программы на C++. stackoverflow.com/q/44610978/2836621   -  person Mark Setchell    schedule 27.03.2018
comment
@MarkSetchell Я не думаю, что это применимо. Я использую это для изменения, а не для вывода. Честно говоря, я просто хочу знать, как найти PID с помощью C++, прежде чем углубляться в другие вещи.   -  person N T    schedule 27.03.2018
comment
Как это можно не применять? Если вы хотите найти processid процесса "fred", вы запускаете pgrep fred в Терминале, и он печатает processid, верно? В вашей программе на C++ вы делаете то же самое, а затем читаете это число, используя popen("/usr/bin/pgrep fred").   -  person Mark Setchell    schedule 27.03.2018
comment
Я использую popen, чтобы найти идентификатор процесса, и в некоторых редких случаях в MacOS Big Sur и Catalina я обнаружил, что он зависает на этом примерно на 10 минут. Почему это может случиться? Есть ли способ избежать этого или добавить к этому некоторое значение тайм-аута?   -  person Masum    schedule 17.02.2021


Ответы (1)


Вы можете использовать proc_listpids вместе с proc_pidinfo:

#include <libproc.h>
#include <stdio.h>
#include <string.h>

void find_pids(const char *name)
{
    pid_t pids[2048];
    int bytes = proc_listpids(PROC_ALL_PIDS, 0, pids, sizeof(pids));
    int n_proc = bytes / sizeof(pids[0]);
    for (int i = 0; i < n_proc; i++) {
        struct proc_bsdinfo proc;
        int st = proc_pidinfo(pids[i], PROC_PIDTBSDINFO, 0,
                             &proc, PROC_PIDTBSDINFO_SIZE);
        if (st == PROC_PIDTBSDINFO_SIZE) {
            if (strcmp(name, proc.pbi_name) == 0) {
                /* Process PID */
                printf("%d [%s] [%s]\n", pids[i], proc.pbi_comm, proc.pbi_name);                
            }
        }       
    }
}


int main()
{
    find_pids("bash");
    return 0;
}
person el.pescado    schedule 27.03.2018
comment
Этот код также можно легко изменить, чтобы он возвращал логическое значение, если программа запущена. Я использовал этот код, чтобы проверить, запущена ли программа или нет. - person Matthew Barclay; 02.09.2019