有没有办法检查进程是64位还是32位?

有没有办法检查进程是64位还是32位?

问题描述:

我正在尝试从进程pid中找到进程类型(32位/ 64位)?有没有办法检查进程是64位还是32位?

我从这里描述的方法中使用GetBSDProcessList获得过程信息和过程列表。

我们如何获得过程类型信息?有任何想法吗?

我可以使用定义(I386)或定义(x86_64的),但只有当我们在过程中。我走出了这个过程。

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

好吧,我做了很多研究并找出了一个更好的解决方案。虽然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; 
}