2011-11-02 5 views
10

J'essaye de trouver le type de processus (32 bit/64bit) du processus pid?Y at-il un moyen de vérifier si le processus est 64 bits ou 32 bits?

Je reçois les informations de processus et la liste de processus à l'aide de la méthode GetBSDProcessList décrite ici. Comment pouvons-nous obtenir les informations sur le type de processus?

Des idées?

Je peux utiliser defined (i386) ou défini (x86_64), mais seulement si nous sommes en train. Je suis hors du processus.

Répondre

14

GetBSDProcessList renvoie kinfo_proc. Le kinfo_proc a un membre kp_procwhich is of type extern_proc. Le extern_prochas a p_flag member, dont l'un des drapeaux est P_LP64, indiquant "Le processus est LP64"). Donc, vous devriez être en mesure de vérifier avec:

int is64bit = proc->kp_proc.p_flags & P_LP64; 

(Note: Comme indiqué dans le commentaire, vous devez utiliser la B_get_process_info trouvée dans http://osxbook.com/book/bonus/chapter8/core/download/gcore.c:

static int 
B_get_process_info(pid_t pid, struct kinfo_proc *kp) 
{ 
    size_t bufsize  = 0; 
    size_t orig_bufsize = 0; 
    int retry_count = 0; 
    int local_error = 0; 
    int mib[4]  = { CTL_KERN, KERN_PROC, KERN_PROC_PID, 0 }; 

    mib[3] = pid; 
    orig_bufsize = bufsize = sizeof(struct kinfo_proc); 

    for (retry_count = 0; ; retry_count++) { 
     local_error = 0; 
     bufsize = orig_bufsize; 
     if ((local_error = sysctl(mib, 4, kp, &bufsize, NULL, 0)) < 0) { 
      if (retry_count < 1000) { 
       sleep(1); 
       continue; 
      } 
      return local_error; 
     } else if (local_error == 0) { 
      break; 
     } 
     sleep(1); 
    } 

    return local_error; 
} 

)

+0

C'est toujours 0. – MacGeek

+1

@Rahul: Que se passe-t-il si vous utilisez le B_get_process_info trouvé dans http://osxbook.com/book/bonus/chapter8/core/download/gcore.c pour obtenir le 'kinfo_proc'? (Et il semble que vous deviez l'exécuter avec 'sudo'.) – kennytm

+0

B_get_process_info fonctionne. Génial. Merci beaucoup! – MacGeek

1

D'accord, j'ai fait beaucoup de recherches et trouvé une meilleure solution. Bien que l'approche sysctl fonctionne, la documentation indique qu'elle devrait être évitée. La méthode ci-dessous utilise la fonction proc_pidinfo de libproc.h et fonctionne de la même manière que sysctl. C'est évidemment pour les plates-formes d'Apple. Je ai testé le code, mais il ne donne pas le résultat souhaité

bool Is64Bit (int pid) 
{ 
    proc_bsdshortinfo info; 
    if (proc_pidinfo (pid, PROC_PIDT_SHORTBSDINFO, 
     0, &info, PROC_PIDT_SHORTBSDINFO_SIZE)) 
     return info.pbsi_flags & PROC_FLAG_LP64; 

    return false; 
} 
Questions connexes