2011-11-02 122 views
10

我正在嘗試從進程pid中找到進程類型(32位/ 64位)?有沒有辦法檢查進程是64位還是32位?

我從這裏描述的方法中使用GetBSDProcessList獲得過程信息和過程列表。

我們如何獲得過程類型信息?有任何想法嗎?

我可以使用定義(I386)或定義(x86_64的),但只有當我們在過程中。我走出了這個過程。

回答

14

GetBSDProcessList返回kinfo_prockinfo_prockp_proc會員which is of type extern_procextern_prochas a p_flag member,其中一個標誌是P_LP64,指示「過程是LP64」)。所以,你應該能夠檢查有:

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

(注:由於在評論中所示,您需要使用B_get_process_info發現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

我測試了代碼,但沒有給出想要的結果。它始終爲0. – MacGeek

+1

@Rahul:如果使用http://osxbook.com/book/bonus/chapter8/core/download/gcore.c中的B_get_process_info來獲取'kinfo_proc'會怎麼樣? (而且你似乎需要用'sudo'來運行它。) – kennytm

+0

B_get_process_info起作用。大。非常感謝! – MacGeek

1

好吧,我做了很多研究並找出了一個更好的解決方案。雖然sysctl方法有效,但文檔聲明應該避免。下面的方法使用libproc.h的proc_pidinfo函數,其工作方式與sysctl類似。這顯然是蘋果的平臺。

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; 
} 
相關問題