2013-01-04 11 views
6

मैंने लिखा एक मूल एप्लिकेशन /proc/PID/status नाम चर का उपयोग करता है। हालांकि, ऐसा प्रतीत होता है कि स्थिति फ़ाइल में नाम चर अपूर्ण है। उदाहरण के लिए, जब मैंने परीक्षण किया तो मैंने एंड्रॉइड कैलकुलेटर खोला और पीएस से पीआईडी ​​देखा और संबंधित /proc/PID फ़ोल्डर में गया। तब मैं बिल्ली स्थिति फ़ाइल को देखने के लिए/proc/pID/स्थिति में किसी प्रक्रिया का नाम पैकेज नाम या ps कमांड से मेल नहीं खाता

Name: oid.calculator 

पुनश्च आदेश com.android.calculator को दर्शाता है। packages.xmlcom.android.calculator दिखाता है। मैंने कुछ अन्य फोनों पर परीक्षण किया (रेजर मैक्सक्स 4.0.4 चल रहा है, Google नेक्सस एक ही ओएस संस्करण चला रहा है) और इसी तरह के व्यवहार को देखा।

उत्तर

11

यह लिनक्स कर्नेल सुविधा पर है: प्रक्रिया के लिए दो अलग-अलग नाम हैं।

  • नामों में से एक निष्पादन योग्य के पथ का अंतिम घटक है, उदा। native_executable यदि आपका आवेदन /data/apps/com.example.hello/native_executable पर स्थित है। यह वह नाम है जो Name/proc/PID/status के क्षेत्र में दिखाई देता है। कर्नेल इसे 15 अक्षरों तक छोटा कर देता है, इसलिए इस मामले में इसमें native_executab शामिल है।
  • दूसरा नाम प्रोग्राम द्वारा पारित किया गया है जो एप्लिकेशन को इसके कमांड लाइन पैरामीटर # 0 (argv[0] में सी, args[0] जावा में) कहते हैं। यह वह नाम है जो /proc/PID/cmdline की शुरुआत में दिखाई देता है और ps दिखाता है।
  • निष्पादन योग्य का मार्ग प्रतीकात्मक लिंक /proc/PID/exe का लक्ष्य भी है।

सम्मेलन द्वारा, जब कोई प्रोग्राम किसी अन्य से शुरू होता है, तो इसे निष्पादन योग्य फ़ाइल के नाम को कमांड लाइन पैरामीटर 0 के रूप में उपयोग करना चाहिए, लेकिन यह अन्यथा करना चुन सकता है। Name/proc/PID/status का क्षेत्र हमेशा कर्नेल द्वारा निष्पादन योग्य (संक्षिप्त) नाम पर सेट होता है।

यह एक सामान्य लिनक्स सुविधा है - Can I use standard tools to get the full name of a process, when its name has embedded spaces? पर Ask Ubuntu पर भी देखें।

एप्लिकेशन स्वयं दोनों नामों को बाद में बदल सकता है (यद्यपि लंबाई बाधाएं हैं)। Dalvik अनुप्रयोगों के बीच अंतर करने के लिए इस क्षमता का उपयोग करता है: सभी अनुप्रयोग एक ही देशी निष्पादन योग्य /sytem/bin/app_process से स्टेम; उन्हें सभी को app_process कहने के बजाय, वीएम दोनों नामों को एप्लिकेशन पैकेज नाम के रूप में बदल देता है। /proc/PID/status में नाम 15 वर्णों तक सीमित है, इसलिए इसे छोटा कर दिया गया है। आप /proc/PID/cmdline से लंबा नाम प्राप्त कर सकते हैं (पहले नल बाइट तक पढ़ें)।

+0

बिल्कुल सही धन्यवाद! – predhme

+0

नाम 15 वर्णों को छोटा करने का कारण क्या है? ('मैन proc' पर TASK_COMM_LEN)। एक बहुत कम सीमा लगता है। –

+1

@PabloBianchi डेटा संरचना स्थिर आकार को रखने के लिए इसे छोटा कर दिया गया है, जो कर्नेल में महत्वपूर्ण है। मुझे नहीं पता कि आकार इतना छोटा क्यों है। – Gilles

संबंधित मुद्दे