【问题标题】:how can i get all process name in os x programmatically? not just app processes如何以编程方式获取 os x 中的所有进程名称?不仅仅是应用程序进程
【发布时间】:2017-09-06 08:41:34
【问题描述】:

我想获取 os x 系统中进程信息的快照。

“NSProcessInfo”只能获取调用进程的信息。

ps cmd 可以是一种解决方案,但我想要一个 c 或 Objective-c 程序。

【问题讨论】:

  • 我已经通过 libc 方法 "proc_listallpids" && "proc_pidpath" 得到了解决方案。
  • 注意:'proc_name'只能获取app程序的进程名,其他进程名(如daemon)将无法获取。

标签: objective-c macos process libc


【解决方案1】:

这是一个使用 libproc.h 迭代系统上所有进程并确定其中有多少属于该进程的有效用户的示例。您可以根据需要轻松修改它。

- (NSUInteger)maxSystemProcs
{
    int32_t maxproc;
    size_t len = sizeof(maxproc);
    sysctlbyname("kern.maxproc", &maxproc, &len, NULL, 0);

    return (NSUInteger)maxproc;
}

- (NSUInteger)runningUserProcs
{
    NSUInteger maxSystemProcs = self.maxSystemProcs;

    pid_t * const pids = calloc(maxSystemProcs, sizeof(pid_t));
    NSAssert(pids, @"Memory allocation failure.");

    const int pidcount = proc_listallpids(pids, (int)(maxSystemProcs * sizeof(pid_t)));

    NSUInteger userPids = 0;
    uid_t uid = geteuid();
    for (int *pidp = pids; *pidp; pidp++) {
        struct proc_bsdshortinfo bsdshortinfo;
        int writtenSize;

        writtenSize = proc_pidinfo(*pidp, PROC_PIDT_SHORTBSDINFO, 0, &bsdshortinfo, sizeof(bsdshortinfo));

        if (writtenSize != (int)sizeof(bsdshortinfo)) {
            continue;
        }

        if (bsdshortinfo.pbsi_uid == uid) {
            userPids++;
        }
    }

    free(pids);
    return (NSUInteger)userPids;
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-06-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多