Determine la información del proceso mediante progtwigción en Darwin / OSX

Tengo una clase con las siguientes funciones de miembro:

/// caller pid virtual pid_t Pid() const = 0; /// physical memory size in KB virtual uint64_t Size() const = 0; /// resident memory for this process virtual uint64_t Rss() const = 0; /// cpu used by this process virtual double PercentCpu() const = 0; /// memory used by this process virtual double PercentMemory() const = 0; /// number of threads in this process virtual int32_t Lwps() const = 0; 

El deber de esta clase es devolver la información del proceso sobre la persona que llama. El tamaño de la memoria física puede determinarse fácilmente mediante una llamada sysctl, y pid es trivial, pero las llamadas restantes me han eludido, aparte de invocar un popen en ps o top y analizar el resultado, lo que no es aceptable. Cualquier ayuda sería muy apreciada.

Requisitos:
Comstack en g ++ 4.0
Sin obj-c
OSX 10.5

La información del proceso proviene de pidinfo :

 cristi:~ diciu$ grep proc_pidinfo /usr/include/libproc.h int proc_pidinfo(int pid, int flavor, uint64_t arg, void *buffer, int buffersize); 

la carga de la CPU proviene de host_statistics :

 cristi:~ diciu$ grep -r host_statistics /usr/include/ /usr/include/mach/host_info.h:/* host_statistics() */ /usr/include/mach/mach_host.defs:routine host_statistics( /usr/include/mach/mach_host.h:/* Routine host_statistics */ /usr/include/mach/mach_host.h:kern_return_t host_statistics 

Para obtener más detalles, consulte las fonts de top y lsof , son de código abierto (debe registrarse como desarrollador de Apple, pero eso es gratis):

https://opensource.apple.com/source/top/top-111.20.1/libtop.c.auto.html

Edición posterior: todas estas interfaces son específicas de la versión, por lo que debe tener esto en cuenta al escribir el código de producción (libproc.h):

 /* * This header file contains private interfaces to obtain process information. * These interfaces are subject to change in future releases. */ 

Como dices que no hay Objective-C, descartaremos la mayoría de los marcos de MacOS.

Puede obtener tiempo de CPU usando getrusage (), que proporciona la cantidad total de tiempo de CPU del usuario y del sistema cargados a su proceso. Para obtener un porcentaje de CPU, necesita hacer una instantánea de los valores de getrusage una vez por segundo (o por muy granular que desee).

 #include  struct rusage r_usage; if (getrusage(RUSAGE_SELF, &r_usage)) { /* ... error handling ... */ } printf("Total User CPU = %ld.%ld\n", r_usage.ru_utime.tv_sec, r_usage.ru_utime.tv_usec); printf("Total System CPU = %ld.%ld\n", r_usage.ru_stime.tv_sec, r_usage.ru_stime.tv_usec); 

Hay un campo de RSS en la estructura getrusage, pero parece ser siempre cero en MacOS X 10.5. Michael Knight escribió una publicación en el blog hace varios años sobre cómo determinar el RSS.

Creo que la mayoría de estos valores están disponibles en Mach API, pero hace mucho tiempo que no busco nada. De forma alternativa, puede ver el código fuente de los comandos “ps” o “top” y ver cómo lo hacen.

Puede usar el siguiente código para información de proceso en mac OS:

 void IsInBSDProcessList(char *name) { assert( name != NULL); kinfo_proc *result; size_t count = 0; result = (kinfo_proc *)malloc(sizeof(kinfo_proc)); if(GetBSDProcessList(&result,&count) == 0) { for (int i = 0; i < count; i++) { kinfo_proc *proc = NULL; proc = &result[i]; } } free(result); } 

kinfo_proc struct contiene toda la información sobre un proceso, como el identificador de proceso (pid), el grupo de procesos, el estado del proceso, etc.

La mayoría de esta información se puede obtener de GetProcessInformation () .

Por cierto, ¿por qué métodos virtuales para funciones que devuelven información de todo el proceso?

Esto es solo CARBONO , y no funcionará con cocoa