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

发布于 2024-12-13 11:01:54 字数 335 浏览 2 评论 0原文

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

我使用 GetBSDProcessList 此处描述的方法。

我们如何获取进程类型信息?有什么想法吗?

我可以使用 Defined(i386) 或 Defined(x86_64),但前提是我们正在进行中。我退出了这个过程。

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.

how can we get the process type information? Any Ideas?

I can use defined(i386) or defined(x86_64) but only if we are in process. I am out of the process.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

冷默言语 2024-12-20 11:01:54

GetBSDProcessList 返回一个kinfo_prockinfo_proc 有一个 kp_proc 成员 其类型为 extern_procextern_proc p_flag 成员,其中一个标志是 P_LP64,表示“进程是 LP64”)。所以你应该能够检查:(

int is64bit = proc->kp_proc.p_flags & P_LP64;

注意:如评论中所示,你需要使用 链接

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

:)

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 Link:

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

)

陌伤ぢ 2024-12-20 11:01:54

好吧,我做了很多研究并找到了更好的解决方案。尽管 sysctl 方法有效,但文档指出应该避免使用它。下面的方法使用 libproc.h 的 proc_pidinfo 函数,其工作方式与 sysctl 类似。这显然是针对苹果平台的。

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

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;
}
梦里人 2024-12-20 11:01:54

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

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

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

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

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]$'

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文