Ho bisogno di un modo per recuperare tutti i processi in esecuzione per tutti gli utenti su un Mac (usando Cocoa). Ho trovato un'implementazione per recuperare il processo usando sysctl, ma ho anche bisogno di un utente in esecuzione. Questo è un taglio di ciò che ho avuto per ottenere l'elenco dei processi, ma c'è un modo per modificarlo per includere anche l'utente?Posso usare `sysctl` per recuperare un elenco di processi con l'utente?
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;
"dichiarazione di kinfo_proc vedrai che ha un membro kp_eproc di tipo struct eproc, che a sua volta ha un membro e_ucred di tipo struct_ucred, che a sua volta ha un membro cr_uid di tipo uid_t "devi amore indiretto in C – Dani
Grazie per la bella risposta ! – bugfixr
Su Lion anche usando KERN_PROC_ALL come questo codice fa sopra sysctl non restituisce tutti i processi. Questo codice restituisce 121 in un test mentre ps -afx restituisce 149. Anche alcuni processi di proprietà dell'utente che esegue il processo sysctl vengono ignorati. Ho guardato attentamente il codice di Bavarious e non sono riuscito a trovare un bug riguardo alla lunghezza, ad esempio, che avrebbe prodotto la discrepanza. – ctpenrose