2011-11-02 18 views
10

プロセスpidからプロセスタイプ(32ビット/ 64ビット)を検索しようとしていますか?プロセスが64ビットか32ビットかをチェックする方法はありますか?

ここに記載されているGetBSDProcessListメソッドを使用してプロセス情報とプロセスリストを取得します。

どのようにプロセスタイプ情報を取得できますか?何か案は?

私は(I386)定義されたか(x86_64の)定義されたが、我々はプロセスである場合にのみ使用することができます。私はプロセスから外れています。

答えて

14

GetBSDProcessListはkinfo_procを返します。 kinfo_procには、kp_procのメンバーwhich is of type extern_procがあります。 extern_prochas 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; 
} 

+0

私はコードをテストしましたが、目的の結果は得られませんでした。常に0です。 – MacGeek

+1

@Rahul:http://osxbook.com/book/bonus/chapter8/core/download/gcore.cにあるB_get_process_infoを使用して 'kinfo_proc'を取得するとどうなりますか? (そして、 'sudo'で実行する必要があるようです。) – kennytm

+0

B_get_process_infoが動作します。すばらしいです。どうもありがとう! – MacGeek

1

さて、私は多くの研究を行い、より良い解決策を見つけました。 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; 
} 
関連する問題