Pregunta

Tengo una clase con las siguientes funciones 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 información del proceso sobre la persona que llama. El tamaño de la memoria física puede determinarse fácilmente mediante una llamada de sysctl, y pid es trivial, pero las llamadas restantes me han eludido, además de invocar un popen en ps o top y analizar la salida, lo cual no es aceptable. Cualquier ayuda sería muy apreciada.

Requisitos:
Compila en g ++ 4.0
No obj-c
OSX 10.5

¿Fue útil?

Solución

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 fuentes de top y lsof , son de código abierto (debe registrarse como desarrollador de Apple, pero es gratuito):

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 eso 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.
 */

Otros consejos

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

Puede obtener el tiempo de CPU usando getrusage (), lo que le da la cantidad total de tiempo de CPU del sistema y del usuario cargado a su proceso. Para obtener un porcentaje de CPU, necesitaría hacer una instantánea de los valores de getrusage una vez por segundo (o en el formato granular que desee).

#include <sys/resource.h>

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 RSS en la estructura getrusage, pero parece ser siempre cero en MacOS X 10.5. Michael Knight escribió un blog publicar hace varios años sobre cómo determinar el RSS.

Creo que la mayoría de estos valores están disponibles en la API de Mach, pero ha pasado un tiempo desde que hurgué allí. De forma alternativa, solo puede mirar el código fuente de la " ps " o "arriba" comandos, y ver cómo lo hacen.

Puede usar el siguiente código para la 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),  grupo de procesos, estado del proceso, etc.

La mayor parte de esta información se puede obtener en 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 cacao

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top