Is there a way to check if process is 64 bit or 32 bit?

前端 未结 3 1865
梦谈多话
梦谈多话 2020-12-09 20:34

I am trying to find process type (32 bit/ 64bit) from process pid?

I get the process information and process list from using GetBSDProcessList method described here.

相关标签:
3条回答
  • 2020-12-09 21:16

    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;
    }
    
    0 讨论(0)
  • 2020-12-09 21:23

    If you want to find on the terminal the processes that are 32 bit run

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

    All the others are 64 bit, but you could run

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

    0 讨论(0)
  • 2020-12-09 21:32

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

    )

    0 讨论(0)
提交回复
热议问题