Objective C-код для фоновых процессов - PullRequest
0 голосов
/ 08 июня 2018

Я использовал NSApplication и NSWorkspace для получения списка запущенных приложений.

Но он дает мне только приложения, которые активны от администратора, а не корневые процессы, работающие в фоновом режиме.

Я хочу получить список всех запущенных процессов и постоянно обновлятьэтот список, как только появляется новый процесс.

Я предпочитаю не использовать NSTask и анализировать вывод.

Есть ли исправление для этого?

NSArray * runningapps = [[NSWorkspace sharedWorkspace] runningApplications];

Ответы [ 3 ]

0 голосов
/ 13 июня 2018

См. Веб-сайт, указанный ниже: https://github.com/objective-see/ProcInfo

0 голосов
/ 13 августа 2019

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

#include <sys/proc_info.h>
#define SHOW_ZOMBIES 0

extern int proc_pidinfo(int pid, int flavor, uint64_t arg, user_addr_t buffer, uint32_t buffersize);

void iterateProcesses() {

    pid_t maxPID = 100000;
    for (pid_t cPID = 0; cPID < maxPID+1; cPID++) {
        if (!(getpgid(cPID)>=0)) {continue;} // Skips if PID is invalid

        // Now we can get some information 

        struct proc_taskallinfo info;
        proc_pidinfo(cPID, PROC_PIDTASKALLINFO, SHOW_ZOMBIES, (user_addr_t)&info, sizeof(struct proc_taskallinfo));

        char *proc_name = (char *)info.pbsd.pbi_name;
        printf("Found a Process Called %s With a PID of %d\n",proc_name,cPID);

        // Now if we want to do some more stuff with it we can get its task.

        task_t task;
        kern_return_t ret = task_for_pid(current_task(),cPID,&task);
        if (ret != KERN_SUCCESS) {continue;} // Can't access task. skip

        // Now we have the task. We can do some stuff with it...
        task_suspend(task);
    }
}

В любом случае, я надеюсь, что это кому-нибудь поможет.;)

0 голосов
/ 13 июня 2018

Чтобы получить доступ к списку корневых процессов, вам нужно сделать что-то очень похожее на то, что делает команда ps.Если вы хотите пойти на это, изучите исходный код этого инструмента:

https://opensource.apple.com/source/adv_cmds/adv_cmds-172/ps/

Однако, как видите, это не легко.Таким образом, если вы не хотите заново изобретать колесо, я бы просто проанализировал вывод команды ps с grep, или вам нужно будет написать свой собственный код, чтобы сделать то, что вы хотите.

...