shaoheng
shaoheng

Reputation: 11

how can i get all process name in os x programmatically? not just app processes

I want to get a snapshot of the process info in the os x system.

The 'NSProcessInfo' can only get info of the calling process.

The ps cmd can be one solution, but i'd like a c or objective-c program.

Upvotes: 0

Views: 892

Answers (1)

Jeremy Huddleston Sequoia
Jeremy Huddleston Sequoia

Reputation: 23651

Here's an example using using libproc.h to iterate over all the processes on the system and determine how many of them belong to the effective user of the process. You can easily modify this for your needs.

- (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;
}

Upvotes: 1

Related Questions