Question

J'ai une classe avec les fonctions membres suivantes:


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

Le devoir de cette classe est de renvoyer les informations de processus concernant l'appelant. La taille de la mémoire physique peut facilement être déterminée par un appel sysctl, et pid est trivial, mais les autres appels ne m'ont pas échappé. Toute aide serait grandement appréciée.

Conditions requises:
Compile sur g ++ 4.0
Aucun obj-c
OSX 10.5

Était-ce utile?

La solution

Les informations de processus proviennent de pidinfo :

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

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

La charge du processeur provient de statistiques_hôte :

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

Pour plus de détails, consultez les sources de top et lsof , elles sont open source (vous devez vous enregistrer en tant que développeur Apple, mais c'est gratuit):

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

Modification ultérieure: Toutes ces interfaces sont spécifiques à la version. Vous devez donc en tenir compte lors de l'écriture du code de production (libproc.h):

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

Autres conseils

Puisque vous dites non Objective-C, nous exclurons la plupart des frameworks MacOS.

Vous pouvez obtenir le temps processeur en utilisant getrusage (), qui indique la quantité totale de temps processeur utilisateur et système imputée à votre processus. Pour obtenir un pourcentage de CPU, vous devez capturer les valeurs de getrusage une fois par seconde (ou la granularité souhaitée).

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

Il existe un champ RSS dans la structure getrusage, mais il semble toujours être nul dans MacOS X 10.5. Michael Knight a écrit un blog. postez il y a plusieurs années sur la façon de déterminer le RSS.

Je pense que la plupart de ces valeurs sont disponibles dans l’API de Mach, mais cela fait un moment que je n’y fouille pas. Vous pouvez également consulter le code source du fichier "ps". ou " top " commandes et voyez comment ils le font.

Vous pouvez utiliser le code ci-dessous pour les informations de processus sous 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 structure kinfo_proc contient toutes les informations sur un processus tel que l'identificateur de processus (pid),  groupe de processus, statut du processus, etc.

La plupart de ces informations peuvent être obtenues à partir de GetProcessInformation () .

À propos, pourquoi les méthodes virtuelles pour les fonctions qui renvoient des informations sur l'ensemble du processus?

Ceci est CARBONE uniquement et ne fonctionne pas avec le cacao

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top