Есть ли способ проверить, является ли процесс 64-разрядным или 32-битным?

Я пытаюсь найти тип процесса (32 бит /64 бит) из процесса pid?

Я получаю информацию о процессе и список процессов с помощью метода GetBSDProcessList, описанного здесь.

как мы можем получить информацию о типе процесса? Любые идеи?

Я могу использовать определенный (i386) или определенный ( x86_64), но только если мы в процессе. Я вне процесса.

Ответы

Ответ 1

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;

(Примечание: как показано в комментарии, вам нужно использовать 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;
}

)

Ответ 2

Хорошо, поэтому я много исследовал и понял лучшее решение. Хотя подход 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;
}

Ответ 3

Если вы хотите найти на терминале 32-битные процессы

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

Все остальные 64-битные, но вы можете запустить

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