2011-11-02 15 views
10

मैं प्रक्रिया पिड से प्रक्रिया प्रकार (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, झंडे में से कौन सा P_LP64 है, जो दर्शाता है "प्रक्रिया एलपी 64 है")।

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

: जैसा कि टिप्पणी में दिखाया गया है, तो आप B_get_process_infohttp://osxbook.com/book/bonus/chapter8/core/download/gcore.c में पाया उपयोग करने की आवश्यकता)

+0

मैंने कोड का परीक्षण किया, लेकिन यह वांछित परिणाम नहीं देता है। यह हमेशा 0. – MacGeek

+1

@Rahul: क्या होगा यदि आप 'kinfo_proc' प्राप्त करने के लिए http://osxbook.com/book/bonus/chapter8/core/download/gcore.c में पाए गए B_get_process_info का उपयोग करते हैं? (और ऐसा लगता है कि आपको इसे 'सुडो' के साथ चलाने की आवश्यकता है।) – kennytm

+0

B_get_process_info काम करता है। महान। बहुत धन्यवाद! – MacGeek

1

तो आप के साथ जांच करने के लिए सक्षम होना चाहिए ठीक है तो मैंने बहुत सारे शोध किए और एक बेहतर समाधान निकाला। हालांकि 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; 
} 
संबंधित मुद्दे