如何获取 Mac 上所有正在运行的进程的列表?

发布于 2024-09-11 13:53:31 字数 127 浏览 3 评论 0原文

最好能得到:

  1. 每个进程的进程 ID
  2. 进程使用了​​多少 CPU 时间

,我们可以在 C 或 Objective C 中为 Mac 执行此操作吗?一些示例代码会很棒!

It would all be good to get:

  1. The process ID of each one
  2. How much CPU time gets used by the process

and can we do this for Mac in C or Objective C? Some example code would be awesome!

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

花开半夏魅人心 2024-09-18 13:53:31

通常的方法是进入 C 并枚举系统上的进程序列号(回溯到 Mac OS X 之前的时代)。 NSWorkspace 有 API,但它们并不总是按照您期望的方式工作。

请注意,经典进程(在 PowerPC 系统上)将使用此代码进行枚举(具有不同的进程序列号),即使它们都共享一个进程 ID。

void DoWithProcesses(void (^ callback)(pid_t)) {
    ProcessSerialNumber psn = { 0, kNoProcess };
    while (noErr == GetNextProcess(&psn)) {
        pid_t pid;
        if (noErr == GetProcessPID(&psn, &pid)) {
            callback(pid);
        }
    }
}

然后,您可以调用该函数并传递一个块,该块将根据 PID 执行您想要的操作。


使用 NSRunningApplication 和 NSWorkspace:

void DoWithProcesses(void (^ callback)(pid_t)) {
    NSArray *runningApplications = [[NSWorkspace sharedWorkspace] runningApplications];
    for (NSRunningApplication *app in runningApplications) {
        pid_t pid = [app processIdentifier];
        if (pid != ((pid_t)-1)) {
            callback(pid);
        }
    }
}

The usual way to do it is to drop into C and enumerate through the process serial numbers on the system (a throwback to pre-Mac OS X days.) NSWorkspace has APIs but they don't always work the way you expect.

Note that Classic processes (on PowerPC systems) will be enumerated with this code (having distinct process serial numbers), even though they all share a single process ID.

void DoWithProcesses(void (^ callback)(pid_t)) {
    ProcessSerialNumber psn = { 0, kNoProcess };
    while (noErr == GetNextProcess(&psn)) {
        pid_t pid;
        if (noErr == GetProcessPID(&psn, &pid)) {
            callback(pid);
        }
    }
}

You can then call that function and pass a block that will do what you want with the PIDs.


Using NSRunningApplication and NSWorkspace:

void DoWithProcesses(void (^ callback)(pid_t)) {
    NSArray *runningApplications = [[NSWorkspace sharedWorkspace] runningApplications];
    for (NSRunningApplication *app in runningApplications) {
        pid_t pid = [app processIdentifier];
        if (pid != ((pid_t)-1)) {
            callback(pid);
        }
    }
}
鹊巢 2024-09-18 13:53:31

您可以使用 BSD sysctl 例程或 ps 命令来获取所有 BSD 进程的列表。请查看 https://stackoverflow.com/ a/18821357/944634

You can use BSD sysctl routine or ps command to get a list of all BSD processes.Have a look at https://stackoverflow.com/a/18821357/944634

幸福丶如此 2024-09-18 13:53:31

嘿,您可以执行系统调用:

ps -eo pid,pcpu

并解析结果。

您可以使用 C 中的 system() 进行此调用。

Hey, you can do a system call as :

ps -eo pid,pcpu

and parse the results.

You can make this call using system() in C.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文