2011-11-02 21 views

risposta

14

GetBSDProcessList restituisce un kinfo_proc. Lo kinfo_proc ha un membro which is of type extern_proc. Lo extern_prochas a p_flag member, che uno dei flag è P_LP64, che indica "Processo è LP64"). Così si dovrebbe essere in grado di controllare con:

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

(Nota: Come indicato nel commento, è necessario utilizzare il B_get_process_info trovata in 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

Ho testato il codice, ma non fornisce il risultato desiderato. È sempre 0. – MacGeek

+1

@Rahul: Che cosa succede se si utilizza B_get_process_info trovato in http://osxbook.com/book/bonus/chapter8/core/download/gcore.c per ottenere il 'kinfo_proc'? (E sembra che tu debba eseguirlo con 'sudo'.) – kennytm

+0

B_get_process_info funziona. Grande. Grazie molto! – MacGeek

1

Okay, ho fatto molte ricerche e ho trovato una soluzione migliore. Sebbene l'approccio sysctl funzioni, la documentazione afferma che dovrebbe essere evitato. Il metodo seguente utilizza la funzione proc_pidinfo di libproc.h e funziona in modo simile a sysctl. Questo è ovviamente per le piattaforme di Apple.

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