Is there a way to check if process is 64 bit or 32 bit?
Okay so I did a lot of research and figured out a better solution. Although the sysctl approach works, the documentation states it should be avoided. The method below uses libproc.h's proc_pidinfo function and works similarly to sysctl. This is obviously for Apple's platforms.
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;
}
GetBSDProcessList returns a kinfo_proc
. The kinfo_proc
has a kp_proc
member which is of type extern_proc
. The extern_proc
has a p_flag
member, which one of the flags is P_LP64, indicating "Process is LP64"). So you should be able to check with:
int is64bit = proc->kp_proc.p_flags & P_LP64;
(Note: As shown in the comment, you need to use the B_get_process_info
found in Link:
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;
}
)