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);
}
}
无论如何,我希望这对某人有所帮助。 ;)
我已经使用 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);
}
}
无论如何,我希望这对某人有所帮助。 ;)