Determina le informazioni di processo a livello di codice in Darwin / OSX

Ho una lezione 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 compito di questa class è di restituire informazioni sul processo al 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:
Compilare su g ++ 4.0
No obj-c
OSX 10.5

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 durante la scrittura del codice di produzione (libproc.h):

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

Dal momento che non dici Objective-C, escluderemo la maggior parte dei framework MacOS.

È ansible 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  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 di 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.

Penso che la maggior parte di questi valori siano disponibili nell’API Mach, ma è passato un po ‘di tempo da quando ci sono andato. In alternativa, puoi semplicemente guardare il codice sorgente per i comandi “ps” o “top” e vedere come lo fanno.

È ansible utilizzare sotto il codice 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); } 

La struttura di kinfo_proc contiene tutte le informazioni su un processo. come Identificatore di processo (pid), gruppo di processi, 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 cocoa