Necesito una forma de recuperar todos los procesos en ejecución para todos los usuarios en una Mac (usando Cocoa). Encontré una implementación para recuperar el proceso usando sysctl, pero también necesito el usuario en ejecución. Esto es un recorte de lo que tengo que obtener de la lista de procesos, pero ¿hay alguna forma de modificarlo para incluir también al usuario?¿Puedo usar `sysctl` para recuperar una lista de procesos con el usuario?
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;
"declaración de kinfo_proc , verás que tiene un miembro kp_eproc de tipo struct eproc, que a su vez tiene un miembro e_ucred de tipo struct _ucred, que a su vez tiene un miembro cr_uid de tipo uid_t "gotta love indirection in C – Dani
Gracias por la buena respuesta ! – bugfixr
En Lion incluso usando KERN_PROC_ALL como este código hace arriba de sysctl no devuelve todos los procesos. Este código devuelve 121 en una prueba mientras que ps -afx devuelve 149. Incluso se ignoran algunos procesos que pertenecen al usuario que ejecuta el proceso sysctl. He observado el código de Bavarious con cuidado y no puedo encontrar un error con respecto a la longitud, por ejemplo, que estaría produciendo la discrepancia. – ctpenrose