目标C代码用于后台进程

时间:2018-06-08 09:21:19

标签: objective-c xcode macos nsarray nsworkspace

我已经使用NSApplication和NSWorkspace来获取正在运行的应用程序列表。

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

我希望获得所有正在运行的进程的列表,并在新进程生成后立即更新该列表。

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

这是否有解决方法?

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

3 个答案:

答案 0 :(得分:1)

要访问根进程列表,您需要执行与ps命令非常相似的操作。如果你想去做,请去研究这个工具的源代码:

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

但是,正如您所看到的,这并不容易。因此,如果您不想重新发明轮子,我只需用ps解析grep命令的输出,或者您需要编写自己的代码来执行您想要的操作。

答案 1 :(得分:1)

请参阅以下网站: here

答案 2 :(得分:0)

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

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