2011-11-02 30 views
10

Tôi đang cố gắng tìm loại quy trình (32 bit/64bit) từ pid xử lý?Có cách nào để kiểm tra xem quy trình là 64 bit hay 32 bit không?

Tôi nhận được thông tin quy trình và danh sách quá trình sử dụng phương thức GetBSDProcessList được mô tả tại đây.

cách chúng tôi có thể nhận thông tin về loại quy trình? Bất kỳ ý tưởng?

tôi có thể sử dụng định nghĩa (i386) hoặc định nghĩa (x86_64) nhưng chỉ khi chúng tôi đang trong quá trình. Tôi ra khỏi quá trình.

Trả lời

14

GetBSDProcessList trả về một kinfo_proc. kinfo_proc có một thành viên kp_procwhich is of type extern_proc. extern_prochas a p_flag member, một trong các cờ là P_LP64, cho biết "Quá trình là LP64"). Vì vậy, bạn sẽ có thể kiểm tra với:

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

(Lưu ý: Như đã trình bày trong các bình luận, bạn cần phải sử dụng B_get_process_info tìm thấy trong 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; 
} 

)

+0

Tôi đã kiểm tra mã nhưng không cung cấp kết quả mong muốn. Nó luôn luôn là 0. – MacGeek

+1

@Rahul: Nếu bạn sử dụng B_get_process_info được tìm thấy trong http://osxbook.com/book/bonus/chapter8/core/download/gcore.c để có được 'kinfo_proc' thì sao? (Và có vẻ như bạn cần chạy nó bằng 'sudo'.) – kennytm

+0

B_get_process_info hoạt động. Tuyệt quá. Cảm ơn nhiều! – MacGeek

1

Được rồi vì vậy tôi đã làm rất nhiều nghiên cứu và tìm ra một giải pháp tốt hơn. Mặc dù cách tiếp cận sysctl hoạt động, tài liệu nói rõ rằng nó nên tránh. Phương thức dưới đây sử dụng hàm proc_pidinfo của libproc.h và hoạt động tương tự như sysctl. Điều này rõ ràng là dành cho các nền tảng của 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; 
} 
Các vấn đề liên quan