I am in need of a way to retrieve all running processes for all users on a Mac (using Cocoa). I found an implementation to retrieve the process using sysctl, but I also need the running user. This is a snipping of what I've got to get the process list, but is there a way to modify it to include the user as well?

int             err;
kinfo_proc *    result;
bool            done;

static const int    name[] = { CTL_KERN, KERN_PROC, KERN_PROC_ALL, 0 };
size_t          length;

// a valid pointer procList holder should be passed
assert( procList != NULL );
// But it should not be pre-allocated
assert( *procList == NULL );
// a valid pointer to procCount should be passed
assert( procCount != NULL );

*procCount = 0;

result = NULL;
done = false;

do
{
    assert( result == NULL );

    // Call sysctl with a NULL buffer to get proper length
    length = 0;
    err = sysctl((int *)name,(sizeof(name)/sizeof(*name))-1,NULL,&length,NULL,0);
    if( err == -1 )
        err = errno;

    // Now, proper length is optained
    if( err == 0 )
    {
        result = malloc(length);
        if( result == NULL )
            err = ENOMEM;   // not allocated
    }

    if( err == 0 )
    {
        err = sysctl( (int *)name, (sizeof(name)/sizeof(*name))-1, result, &length, NULL, 0);
        if( err == -1 )
            err = errno;

        if( err == 0 )
            done = true;
        else if( err == ENOMEM )
        {
            assert( result != NULL );
            free( result );
            result = NULL;
            err = 0;
        }
    }
} while ( err == 0 && !done );

// Clean up and establish post condition
if( err != 0 && result != NULL )
{
    free(result);
    result = NULL;
}

*procList = result; // will return the result as procList
if( err == 0 )
    *procCount = length / sizeof( kinfo_proc );

assert( (err == 0) == (*procList != NULL ) );

return err;
Edit
Report