2011-11-15 6 views
5

Quiero que mi programa (basado en C/C++) muestre un indicador numérico de cuántos procesos están actualmente presentes en el sistema local. El valor de número de procesos en ejecución se consultará a menudo (por ejemplo, una vez por segundo) para actualizar mi visualización.¿Existe alguna manera ligera de obtener la cantidad actual de procesos en Linux?

¿Hay alguna manera ligera de obtener ese número? Obviamente, podría llamar "ps ax | wc -l", pero preferiría no forzar a la computadora a engendrar un proceso y analizar varios cientos de líneas de texto para obtener un solo entero.

Este programa se ejecutará principalmente bajo Linux, pero también podría funcionar bajo MacOS/X o Windows también, por lo que las técnicas relevantes para esos sistemas operativos también serían útiles.

Lo ideal sería que estoy buscando algo como this, excepto disponibles bajo Linux (getsysinfo() parece ser más de una cosa Minix)

Gracias, Jeremy

+0

posible duplicado de [API de Linux para listar procesos en ejecución?] (Http://stackoverflow.com/questions/939778/linux-api-to-list-running-processes) –

+0

como aquí: [http: //stackoverflow.com/questions/939778/linux-api-to-list-running-processes]? –

+1

No quiero una lista de los procesos en ejecución, solo un conteo. –

Respuesta

12

.... y, por supuesto, 1 minuto después de publicar la pregunta, descubro la respuesta: sysinfo devolverá (entre otras cosas) un campo que indica cuántos procesos hay.

Dicho esto, si alguien sabe de un MacOS/X y/o Windows equivalente a sysinfo(), todavía estoy interesado en eso.


Actualización: Aquí está la función con la que finalmente terminé.

#ifdef __linux__ 
# include <sys/sysinfo.h> 
#elif defined(__APPLE__) 
# include <sys/sysctl.h> 
#elif defined(WIN32) 
# include <Psapi.h> 
#endif 

int GetTotalNumProcesses() 
{ 
#if defined(__linux__) 
    struct sysinfo si; 
    return (sysinfo(&si) == 0) ? (int)si.procs : (int)-1; 
#elif defined(__APPLE__) 
    size_t length = 0; 
    static const int names[] = {CTL_KERN, KERN_PROC, KERN_PROC_ALL, 0}; 
    return (sysctl((int *)names, ((sizeof(names)/sizeof(names[0]))-1, NULL, &length, NULL, 0) == 0) ? (int)(length/sizeof(kinfo_proc)) : (int)-1; 
#elif defined(WIN32) 
    DWORD aProcesses[1024], cbNeeded; 
    return EnumProcesses(aProcesses, sizeof(aProcesses), &cbNeeded) ? (cbNeeded/sizeof(DWORD)) : -1; 
#else 
    return -1; 
#endif 
} 
+0

+1, eso es en realidad mucho más fácil que mi sugerencia. –

3

opendir("/proc") y contar el número de entradas que son directorios y tienen nombres solo de dígitos.

Cuestiones relacionadas