Есть ли способ проверить, является ли процесс 64-битным или 32-битным? - PullRequest
10 голосов
/ 02 ноября 2011

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

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

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

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

Ответы [ 3 ]

14 голосов
/ 02 ноября 2011

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

) * * тысяча двадцать-два

1 голос
/ 13 января 2015

Хорошо, поэтому я провел много исследований и нашел лучшее решение.Хотя подход sysctl работает, в документации говорится, что его следует избегать.Приведенный ниже метод использует функцию proc_pidinfo в libproc.h и работает аналогично 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;
}
0 голосов
/ 25 мая 2019

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

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

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

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

...