Frage

Ich habe eine Klasse mit den folgenden Elementfunktionen:


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

Pflicht Diese Klasse ist Prozessinformationen über Anrufer zurückzukehren. Physische Speichergröße kann durch einen sysctl Anruf leicht bestimmt und pid ist trivial, aber die restlichen Anrufe haben mir entzog, abgesehen von einem Popen auf ps oder top aufrufen und die Ausgabe Parsen - was nicht akzeptabel ist. Jede Hilfe wäre sehr geschätzt.

Anforderungen:
Compiliert auf g ++ 4.0
Keine obj-c
OSX 10.5

War es hilfreich?

Lösung

Prozess Info kommt von pidinfo:

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

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

CPU-Last kommt von 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

Für weitere Informationen Besuch Quellen für top und lsof, sie sind Open-Source (Sie müssen als Apple-Entwickler registrieren, aber das ist kostenlos):

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

Später bearbeiten: Alle diese Schnittstellen sind versionsspezifisch, so dass Sie das berücksichtigen müssen, wenn die Produktion Code zu schreiben (libproc.h):

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

Andere Tipps

Da Sie keine Objective-C sagen, wir werden die meisten der Frameworks MacOS ausschließen.

Sie können die CPU-Zeit mit getrusage () erhalten, die die Gesamtmenge der Benutzer- und System CPU-Zeit auf Ihren Prozess geladen gibt. Um eine CPU Prozentsatz erhalten Sie bräuchten die getrusage Werte Snapshot einmal pro Sekunde (oder aber körnig Sie sein wollen).

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

Es ist ein RSS-Feld in der getrusage Struktur, sondern erscheint immer Null zu sein, in MacOS X 10.5. Michael Knight ein Blog geschrieben Post vor einigen Jahren darüber, wie die RSS zu bestimmen.

Ich denke, die meisten diese Werte in dem Mach-API zur Verfügung, aber es ist schon eine Weile her, dass ich um dort gestoßen habe. Alternativ können Sie sich den Quellcode schauen nur für die „ps“ oder „top“ Befehle, und sehen, wie sie es tun.

Sie können unter Code für Prozessinformationen in Mac OS verwenden:

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 enthält alle Informationen über einen process.such als Prozeßkennung (PID),  Prozessgruppe, Prozessstatus und etc.

Die meisten dieser Informationen können von GetProcessInformation () .

Durch die Art und Weise, warum virtuelle Methoden für Funktionen, die prozessweit info zurückkehren?

Dies ist CARBON nur, und nicht mit Kakao arbeitet

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top