我已经使用NSApplication和NSWorkspace来获取正在运行的应用程序列表。
但它只给我管理员激活的应用程序,而不是后台运行的根进程。
我希望获得所有正在运行的进程的列表,并在新进程生成后立即更新该列表。
我不想使用NSTask
并解析输出。
这是否有解决方法?
NSArray * runningapps = [[NSWorkspace sharedWorkspace] runningApplications];
答案 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);
}
}
无论如何,我希望这对某人有帮助。 ;)