2008-10-20 9 views
15

Ho una classe con le seguenti funzioni membro:Determinare Processo Info livello di programmazione a 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; 
 

Questa classe dovere è quello di restituire informazioni su processo chiamante. Le dimensioni della memoria fisica possono essere facilmente determinate 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 il g ++ 4.0
No obj-c
OSX 10.5

+1

Si prega di descrivere perché si desidera creare una classe che fa questo. La maggior parte del software che gira su Mac OS X non dovrebbe preoccuparsi di nessuna delle cose che hai descritto. Inoltre, "no Objective-C" non è una politica ragionevole durante lo sviluppo per Mac OS X. –

risposta

11

informazioni di processo viene 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); 

carico della CPU viene 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 ulteriori dettagli, controlla le fonti per top e lsof, sono open source (è necessario registrati come uno sviluppatore Apple ma è gratuito):

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

Successivamente modificare: Tutte queste interfacce sono versione specifica, quindi è necessario tenerne conto durante la scrittura di codice di produzione (libproc.h):

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

penso la maggior parte di questi valori sono disponibili nelle API di Mach, ma è stato un po 'che ho curiosato circa in là. In alternativa, puoi semplicemente guardare il codice sorgente per i comandi "ps" o "top" e vedere come lo fanno.

0

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

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

Questo è CARBONIO solo, e non funzionerà con il cacao

+0

Nota che GetProcessInformation() è una funzione API Win32, non Mac OS X come l'OP sta parlando. –

+0

In realtà @benhoyt, il suo link punta alla documentazione Apple che include una funzione chiamata 'GetProcessInformation()', ma è comunque parte di un framework. –

+1

GetProcessInformation() è una chiamata Mac, ma non misura l'utilizzo della CPU. Inoltre, è deprecato. Fa parte del vecchio Process Manager dai giorni del Mac Toolbox (precedente a MacOS X). Non consiglierei di usarlo affatto su MacOS X. Restituisce informazioni che non sono nemmeno rilevanti come le informazioni sulla memoria del processo. Questo era un concetto di MacOS 9 e precedenti in cui non aveva la memoria virtuale moderna. Le app accedevano direttamente a una singola partizione di memoria del computer (e potevano modificarsi a vicenda indipendentemente dai privilegi). Non usarlo – brant

6

Dal momento che dici no Objective-C ci escludiamo la maggior parte dei quadri MacOS.

È possibile ottenere il tempo della CPU utilizzando getrusage(), che consente di addebitare al processo la quantità totale di tempo CPU utente e sistema. Per ottenere una percentuale di CPU è necessario eseguire un'istantanea dei valori di getrusage una volta al secondo (o comunque granulare si desidera 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); 

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

+0

puoi anche spiegare come ottenere l'utilizzo della memoria del processo in esecuzione nel cacao? –

2

È possibile utilizzare il codice qui sotto per 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 identificatore di processo (PID), gruppo di processi, lo stato del processo e così via