【问题标题】:Objective C code for background processes后台进程的目标 C 代码
【发布时间】:2019-08-13 19:24:25
【问题描述】:

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

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

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

我不喜欢使用NSTask 来解析输出。

有解决办法吗?

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

【问题讨论】:

  • 我认为以下一个很有用。 Programmatically check if a process is running on Mac
  • 你想做什么?也许你不需要你所要求的。您是否正在尝试检查您生成的进程是否正在运行?
  • 我想知道是否有任何进程在后台产生。我可以为应用程序执行此操作,但未列出根进程

标签: objective-c xcode macos nsarray nsworkspace


【解决方案1】:

【讨论】:

    【解决方案2】:

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

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

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

    【讨论】:

    • 毕竟没有必要是root才能列出所有进程。我只是设法从 lldb 中的 Apple 源代码构建和运行 ps,它无需 root 即可工作。
    【解决方案3】:

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

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

    【讨论】:

    • 这真的很有用,而且几乎正是我想要的。谢谢!但是,我发现这段代码在每次迭代时都会泄漏内存。我通过用以下代码替换相关代码行解决了内存泄漏:proc_pidinfo(cPID, PROC_PIDTASKALLINFO, (uint64_t)0, &info, sizeof(info));
    • 啊,我的错,这很好,你有一些用处:P
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-12-06
    • 1970-01-01
    • 1970-01-01
    • 2012-03-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多