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

我试图从进程pid中找到进程类型(32位/ 64位)?

我使用此处描述的GetBSDProcessList方法获取进程信息和进程列表。

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

我可以使用已定义的( i386 )或已定义的( x86_64 ),但前提是我们正在处理中。 我不在这个过程中。

GetBSDProcessList返回kinfo_prockinfo_proc有一个kp_proc成员,类型为extern_procextern_proc 有一个p_flag成员 ,其中一个标志是P_LP64 ,表示“Process is LP64”。 所以你应该能够检查:

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

(注意:如注释中所示,您需要使用http://osxbook.com/book/bonus/chapter8/core/download/gcore.c中的B_get_process_info

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

好的,所以我做了很多研究,找到了更好的解决方案。 尽管sysctl方法有效,但文档说明应该避免使用它。 下面的方法使用libproc.h的proc_pidinfo函数,其工作方式与sysctl类似。 这显然适用于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; }