プロセスpidからプロセスタイプ(32ビット/ 64ビット)を検索しようとしていますか?プロセスが64ビットか32ビットかをチェックする方法はありますか?
ここに記載されているGetBSDProcessListメソッドを使用してプロセス情報とプロセスリストを取得します。
どのようにプロセスタイプ情報を取得できますか?何か案は?
私は(I386)定義されたか(x86_64の)定義されたが、我々はプロセスである場合にのみ使用することができます。私はプロセスから外れています。
プロセスpidからプロセスタイプ(32ビット/ 64ビット)を検索しようとしていますか?プロセスが64ビットか32ビットかをチェックする方法はありますか?
ここに記載されているGetBSDProcessListメソッドを使用してプロセス情報とプロセスリストを取得します。
どのようにプロセスタイプ情報を取得できますか?何か案は?
私は(I386)定義されたか(x86_64の)定義されたが、我々はプロセスである場合にのみ使用することができます。私はプロセスから外れています。
GetBSDProcessListはkinfo_proc
を返します。 kinfo_proc
には、kp_proc
のメンバーwhich is of type extern_proc
があります。 extern_proc
has a p_flag
memberであり、フラグの1つは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;
}
)
さて、私は多くの研究を行い、より良い解決策を見つけました。 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;
}
私はコードをテストしましたが、目的の結果は得られませんでした。常に0です。 – MacGeek
@Rahul:http://osxbook.com/book/bonus/chapter8/core/download/gcore.cにあるB_get_process_infoを使用して 'kinfo_proc'を取得するとどうなりますか? (そして、 'sudo'で実行する必要があるようです。) – kennytm
B_get_process_infoが動作します。すばらしいです。どうもありがとう! – MacGeek