Pergunta

Eu tenho uma classe com as seguintes funções membro:


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

dever Esta classe é retornar processar informações acerca de chamadas. tamanho da memória física pode facilmente determinado por uma chamada sysctl, e pid é trivial, mas as chamadas restantes têm me iludiu, além de invocar um popen no ps ou superior e analisando a saída - o que não é aceitável. Qualquer ajuda seria muito apreciada.

Requisitos:
Compila sobre g ++ 4.0
Sem obj-c
OSX 10.5

Foi útil?

Solução

info Processo vem 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 da CPU vem 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 mais detalhes, consulte a fontes de top e lsof, eles são de código aberto (você precisa se registrar como um desenvolvedor da Apple, mas que é gratuito):

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

editar Depois: Todas estas interfaces são versão específica, então você precisa levar isso em conta ao escrever código de produção (libproc.h):

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

Outras dicas

Uma vez que você dizer não Objective-C vamos descartar a maioria dos quadros MacOS.

Você pode obter tempo de CPU usando getrusage (), o que dá a quantidade total de Usuário e CPU Sistema tempo debitado no seu processo. Para obter uma porcentagem CPU que você precisa para instantâneo os valores getrusage uma vez por segundo (ou no entanto granular você quer ser).

#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);

Existe um campo de RSS na estrutura getrusage, mas é parece ser sempre zero em MacOS X 10.5. Michael Knight escreveu um blog postar há vários anos sobre como determinar o RSS.

Eu acho que a maioria destes valores estão disponíveis na API Mach, mas tem sido um tempo desde que eu coloquei em torno de lá. Alternativamente, você pode simplesmente olhar para o código-fonte para o "ps" ou comandos "top", e ver como eles fazem isso.

Você pode usar o código abaixo para informações processo no 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 contém todas as informações sobre um process.such como identificador de processo (PID), grupo de processos, status do processo e etc.

A maior parte desta informação pode ser obtido a partir de GetProcessInformation () .

A propósito, por que métodos virtuais para funções que informações de retorno processwide?

Esta é CARBONO apenas, e não vai funcionar com cacau

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top