Objective C 后台进程代码

Objective C code for background processes

我已经使用 NSApplication 和 NSWorkspace 获取了 运行ning 应用程序的列表。

但它只给我管理员激活的应用程序,而不是后台 运行 的根进程。

我想获取所有 运行ning 进程的列表,并在新进程产生后立即更新该列表。

我不想使用 NSTask 和解析输出。

有解决办法吗?

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

要访问根进程列表,您需要执行与 ps 命令非常相似的操作。想上手就去研究一下这个工具的源码:

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

然而,如您所见,这并不容易。因此,如果你不想重新发明轮子,我只是用 grep 解析 ps 命令的输出,否则你将需要编写自己的代码来做你想做的事。

参考下面给出的网站: https://github.com/objective-see/ProcInfo

我实现这一点的方法是简单地遍历每个进程标识符(在一定程度上)。 (这确实需要更高的权限,尽管像 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);
    }
}

无论如何,我希望这对某人有所帮助。 ;)