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

RLT*_*RLT 10 c macos macos-carbon objective-c

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

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

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

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

ken*_*ytm 14

GetBSDProcessList返回一个kinfo_proc.在kinfo_proc具有kp_proc构件,其是类型的extern_proc.在extern_proc 具有p_flag构件,其标志之一是P_LP64,表示"过程是LP64").所以你应该能够检查:

int is64bit = proc->kp_proc.p_flags & P_LP64;
Run Code Online (Sandbox Code Playgroud)

(注:由于在评论中所示,您需要使用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;
}
Run Code Online (Sandbox Code Playgroud)

)