2008-10-20 5 views
15

Ich habe eine Klasse mit den folgenden Elementfunktionen:in 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; 
 

Diese Klasse Pflicht ist Prozessinformationen über Anrufer zurückzukehren. Die Größe des physischen Speichers kann leicht durch einen sysctl-Aufruf bestimmt werden, und pid ist trivial, aber die verbleibenden Aufrufe sind mir entgangen, abgesehen davon, dass ein Popen auf ps oder top aufgerufen wurde und die Ausgabe analysiert wurde - was nicht akzeptabel ist. Jede Hilfe würde sehr geschätzt werden.

Anforderungen:
Kompilieren auf g ++ 4.0
No obj-c
OSX 10.5

+1

Bitte beschreiben Sie, warum Sie eine Klasse erstellen möchten, die dies tut. Die meisten Programme, die unter Mac OS X laufen, sollten sich um nichts kümmern, was Sie beschrieben haben. Auch "keine Objective-C" ist keine vernünftige Richtlinie bei der Entwicklung für Mac OS X. –

Antwort

11

Prozessinformation 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 

Weitere Einzelheiten Quellen Besuche für top und lsof, sie sind Open-Source (Sie müssen Registrieren Sie sich als Apple-Entwickler, aber das ist kostenlos):

https://opensource.apple.com/source/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. 
*/ 
2

Ich denke, die meisten diese Werte in dem Mach-API zur Verfügung, aber es ist schon eine Weile her, seit ich gestoßen habe herum da drinnen. Alternativ können Sie auch den Quellcode für die Befehle "ps" oder "top" ansehen und sehen, wie sie das tun.

0

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

Übrigens, warum virtuelle Methoden für Funktionen, die prozessweit Informationen zurückgeben?

Dies ist CARBON nur und wird mit Kakao

+0

Beachten Sie, dass GetProcessInformation() eine Win32-API-Funktion ist, nicht Mac OS X wie die OP spricht. –

+0

Eigentlich @benhoyt, seine Link verweist auf Apple-Dokumentation, die eine Funktion namens "GetProcessInformation()" enthält, aber es ist jedoch Teil eines Frameworks. –

+1

GetProcessInformation() ist ein Mac-Aufruf, es wird jedoch nicht die CPU-Auslastung gemessen. Außerdem ist es veraltet. Es ist Teil des alten Prozessmanagers aus den Mac Toolbox-Tagen (vor MacOS X). Ich würde nicht empfehlen, es überhaupt auf MacOS X zu verwenden. Es gibt Informationen zurück, die nicht einmal relevant sind, wie Informationen über den Speicher des Prozesses. Dies war ein Konzept von MacOS 9 und früher, wo es keinen modernen virtuellen Speicher hatte. Apps haben direkt auf eine einzelne Speicherpartition des Computers zugegriffen (und konnten den Speicher des anderen unabhängig von den Berechtigungen ändern). Benutze es nicht. – brant

6

nicht funktionieren, da Sie kein Objective-C sagen, dass wir die meisten des MacOS-Frameworks ausschließen werden.

Sie können die CPU-Zeit mit der Verwendung von getrusage() ermitteln, wodurch die gesamte Benutzer- und System-CPU-Zeit für Ihren Prozess berechnet wird. Um einen CPU-Prozentsatz zu erhalten, müssen Sie die Grafikwerte einmal pro Sekunde erfassen (oder wie granular Sie auch sein mögen).

#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 in MacOS X 10.5 zu sein. Michael Knight hat vor einigen Jahren einen Blogbeitrag geschrieben, wie man den RSS ermittelt.

+0

Kannst du auch erklären, wie man die Speichernutzung des laufenden Prozesses in Kakao erhält? –

2

Sie unter Code für Prozessinformationen können 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 enthält alle Informationen über einen process.such als Prozeßkennung (PID), Prozessgruppe, Prozessstatus und etc.