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

时间:2011-11-02 16:37:45

标签: objective-c c macos macos-carbon

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

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

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

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

3 个答案:

答案 0 :(得分:14)

GetBSDProcessList返回kinfo_prockinfo_proc有一个kp_proc成员which is of type extern_procextern_proc has a p_flag member,其中一个标志是 P_LP64 ,表示“进程是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;
}

答案 1 :(得分:1)

好的,所以我做了很多研究,找到了更好的解决方案。尽管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;
}

答案 2 :(得分:0)

如果要在终端上查找32位运行的进程

ps aux -oflags | grep '[01238ab]$'

其他所有都是64位的,但是您可以运行

ps aux -oflags | grep '[4567cdef]$'