2008-10-20 14 views
15

tengo una clase con las siguientes funciones miembro:Información del proceso mediante programación en Darwin/OSX


/// 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; 
 

Esta clase deber es volver a procesar información 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:
recopila sobre g ++ 4.0
Sin obj-c
OSX 10.5

+1

Por favor, describa por qué quiere crear una clase que haga esto. La mayoría del software que se ejecuta en Mac OS X no debería preocuparse por ninguna de las cosas que ha descrito. Además, "no Objective-C" no es una política razonable cuando se desarrolla para Mac OS X. –

Respuesta

11

Detalles de Procesos 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); 

carga de la CPU viene 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 más detalles, echa un vistazo a las fuentes de top y lsof, que son de código abierto (es necesario regístrese como desarrollador de Apple, pero eso es gratis):

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

Más tarde editar: Todas estas interfaces son versión específica, por lo que es necesario tomar en cuenta que 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. 
*/ 
2

Creo que la mayoría de estos valores están disponibles en la API de Mach, pero pasado un tiempo desde que he clavaban por ahí dentro. De forma alternativa, puede ver el código fuente de los comandos "ps" o "top" y ver cómo lo hacen.

0

La mayor parte 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?

Esta es CARBONO solamente, y no va a funcionar con el cacao

+0

Tenga en cuenta que GetProcessInformation() es una función API de Win32, no Mac OS X, como los OP están hablando. –

+0

En realidad, @benhoyt, su enlace apunta a la documentación de Apple que incluye una función llamada 'GetProcessInformation()', pero sin embargo es parte de un framework. –

+1

GetProcessInformation() es una llamada de Mac, pero no mide el uso de la CPU. Además, se desaprobó. Es parte del antiguo Process Manager desde los días de Mac Toolbox (antes de MacOS X). No recomendaría usarlo en absoluto en MacOS X. Devuelve información que ni siquiera es relevante, como la información sobre la memoria del proceso. Este era un concepto de MacOS 9 y anteriores donde no tenía memoria virtual moderna. Las aplicaciones solo accedían directamente a una sola partición de memoria de la computadora (y podían modificar la memoria de las otras independientemente de los privilegios). No lo uses – brant

6

Dado que usted dice que no Objective-C vamos a descartar la mayoría de los marcos de MacOS.

Puede obtener tiempo de CPU utilizando getrusage(), que proporciona la cantidad total de tiempo de CPU del usuario y del sistema cargados en 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 <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 de RSS en la estructura getrusage, pero se parece ser siempre cero en MacOS X 10.5. Michael Knight escribió una publicación en el blog hace varios años acerca de cómo determinar el RSS.

+0

¿También puede explicar cómo obtener el uso de la memoria del proceso de ejecución en el cacao? –

2

Puede utilizar a continuación el código de información del 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 process.such como identificador de proceso (PID), grupo de proceso, el estado del proceso y etc.

Cuestiones relacionadas