Domanda

Ho una classe con le seguenti funzioni 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; 

Il dovere di questa classe è di restituire informazioni sul processo relative al chiamante. La dimensione della memoria fisica può essere facilmente determinata da una chiamata sysctl e il pid è banale, ma le chiamate rimanenti mi hanno eluso, a parte invocare un popen su ps o top e analizzare l'output - il che non è accettabile. Qualsiasi aiuto sarebbe molto apprezzato.

Requisiti:
Compila su g ++ 4.0
No obj-c
OSX 10.5

È stato utile?

Soluzione

Le informazioni sul processo provengono da pidinfo :

cristi:~ diciu$ grep proc_pidinfo /usr/include/libproc.h

int proc_pidinfo(int pid, int flavor, uint64_t arg,  void *buffer, int buffersize);

il carico della CPU proviene da 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

Per maggiori dettagli, controlla le fonti per top e lsof , sono open source (devi registrarti come sviluppatore Apple ma è gratuito):

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

Modifica successiva: tutte queste interfacce sono specifiche della versione, quindi è necessario tenerne conto quando si scrive il codice di produzione (libproc.h):

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

Altri suggerimenti

Dato che non dici di Objective-C, escluderemo la maggior parte dei framework MacOS.

È possibile ottenere il tempo CPU utilizzando getrusage (), che fornisce la quantità totale di tempo CPU utente e di sistema addebitata al processo. Per ottenere una percentuale di CPU dovresti eseguire l'istantanea dei valori di getrusage una volta al secondo (o per quanto granulare tu voglia essere).

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

Esiste un campo RSS nella struttura getrusage, ma sembra essere sempre zero in MacOS X 10.5. Michael Knight ha scritto un blog pubblicare diversi anni fa su come determinare l'RSS.

Penso che la maggior parte di questi valori siano disponibili nell'API di Mach, ma è passato un po 'di tempo da quando ho cercato. In alternativa, puoi semplicemente guardare il codice sorgente per " ps " o " in alto " comandi e vedere come lo fanno.

È possibile utilizzare il codice seguente per le informazioni sul processo in 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 tutte le informazioni su un process.such come Process identifier (pid),  gruppo di processo, stato del processo e così via

La maggior parte di queste informazioni può essere ottenuta da GetProcessInformation () .

A proposito, perché i metodi virtuali per le funzioni che restituiscono informazioni a livello di processo?

Questo è solo CARBONIO e non funzionerà con il cacao

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top