我正在嘗試從進程pid中找到進程類型(32位/ 64位)?有沒有辦法檢查進程是64位還是32位?
我從這裏描述的方法中使用GetBSDProcessList獲得過程信息和過程列表。
我們如何獲得過程類型信息?有任何想法嗎?
我可以使用定義(I386)或定義(x86_64的),但只有當我們在過程中。我走出了這個過程。
我正在嘗試從進程pid中找到進程類型(32位/ 64位)?有沒有辦法檢查進程是64位還是32位?
我從這裏描述的方法中使用GetBSDProcessList獲得過程信息和過程列表。
我們如何獲得過程類型信息?有任何想法嗎?
我可以使用定義(I386)或定義(x86_64的),但只有當我們在過程中。我走出了這個過程。
GetBSDProcessList返回kinfo_proc
。 kinfo_proc
有kp_proc
會員which is of type extern_proc
。 extern_proc
has 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;
}
)
好吧,我做了很多研究並找出了一個更好的解決方案。雖然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;
}
我測試了代碼,但沒有給出想要的結果。它始終爲0. – MacGeek
@Rahul:如果使用http://osxbook.com/book/bonus/chapter8/core/download/gcore.c中的B_get_process_info來獲取'kinfo_proc'會怎麼樣? (而且你似乎需要用'sudo'來運行它。) – kennytm
B_get_process_info起作用。大。非常感謝! – MacGeek