2012-09-05 9 views
6

मैं ओएसएक्स माउंटेन शेर पर हूं और अपने पीआईडी ​​का उपयोग कर प्रक्रियाओं के नाम को पुनः प्राप्त करने की कोशिश कर रहा हूं।पीआईडी ​​से नाम प्राप्त करें?

pid_t pid = 10687; 
char pathBuffer [PROC_PIDPATHINFO_MAXSIZE] = ""; 
char nameBuffer [256] = ""; 

int sizeOfVal = sizeof(nameBuffer); 
proc_pidpath(pid, pathBuffer, sizeof(pathBuffer)); 
proc_name(pid, nameBuffer, sizeof(nameBuffer)); 

NSLog(@"Path: %s\n Name: %s\n", pathBuffer, nameBuffer); 

ऊपर कोड नाम ठीक से पुनः प्राप्त करने में सक्षम है, लेकिन यह केवल पहले 15 वर्ण प्राप्त करता है और "पर ध्यान नहीं देता" बाकी:

निम्नलिखित कोड मैं का उपयोग कर रहा है। नोट यह नाम प्रदर्शित करने में कोई समस्या नहीं है, लेकिन पुनर्प्राप्त करने के साथ। समस्या मेरे शेष एप्लिकेशन के साथ नहीं है क्योंकि मैं एक स्टैंडअलोन एप्लिकेशन में उपर्युक्त कोड का परीक्षण कर रहा हूं। यह भी ध्यान रखें कि मैंने पीआईडी ​​को बदलने की कोशिश की, लेकिन इस बात पर ध्यान दिए बिना कि मैं जिस पीआईडी ​​को कोड का प्रयास करता हूं, केवल नाम के पहले 15 अक्षर पुनर्प्राप्त करता है। पथ पुनर्प्राप्ति पूरी तरह से काम करता है।

क्या किसी के पास कोई गलत विचार है कि मैं क्या कर रहा हूं?

+0

, मैं कुछ और अजीबता मिली। यदि निर्दिष्ट बफर लंबाई 32 बाइट से कम है, तो स्ट्रिंग में कुछ भी नहीं रखा जाएगा, भले ही नाम छोटा हो (और 31 बाइट बफर में फिट होगा) – charliehorse55

उत्तर

8

फ़ंक्शन मूल्य को देखता है proc_bsdshortinfo है। यह 16 बाइट स्ट्रिंग, या 15 पठनीय पात्रों को वापस करने के लिए सीमित है जब शून्य टर्मिनेटर समेत।

sys/param.h से

:

#define MAXCOMLEN 16  /* max command name remembered */ 

sys/proc_info.h से:

struct proc_bsdshortinfo { 
     uint32_t    pbsi_pid;  /* process id */ 
     uint32_t    pbsi_ppid;  /* process parent id */ 
     uint32_t    pbsi_pgid;  /* process perp id */ 
    uint32_t    pbsi_status;  /* p_stat value, SZOMB, SRUN, etc */ 
    char     pbsi_comm[MAXCOMLEN]; /* upto 16 characters of process name */ 
    uint32_t    pbsi_flags;    /* 64bit; emulated etc */ 
     uid_t     pbsi_uid;  /* current uid on process */ 
     gid_t     pbsi_gid;  /* current gid on process */ 
     uid_t     pbsi_ruid;  /* current ruid on process */ 
     gid_t     pbsi_rgid;  /* current tgid on process */ 
     uid_t     pbsi_svuid;  /* current svuid on process */ 
     gid_t     pbsi_svgid;  /* current svgid on process */ 
     uint32_t    pbsi_rfu;  /* reserved for future use*/ 
}; 

संपादित करें: इस के आसपास पाने के लिए, पिछले पथ घटक मिल: मैं इस मुद्दे की जांच की के रूप में

pid_t pid = 3051; 
char pathBuffer [PROC_PIDPATHINFO_MAXSIZE]; 
proc_pidpath(pid, pathBuffer, sizeof(pathBuffer)); 

char nameBuffer[256]; 

int position = strlen(pathBuffer); 
while(position >= 0 && pathBuffer[position] != '/') 
{ 
    position--; 
} 

strcpy(nameBuffer, pathBuffer + position + 1); 

printf("path: %s\n\nname:%s\n\n", pathBuffer, nameBuffer); 
+0

धन्यवाद। किसी भी मौके से आप इसे एक समाधान के बारे में जानते हैं? – fdh

+0

पूर्ण पथ प्राप्त करें और फिर स्ट्रिंग को अंतिम पथ घटक पर ट्रिम करें। – charliehorse55

+0

क्या कोई और सुरुचिपूर्ण समाधान नहीं है? प्रक्रिया को पुनर्प्राप्त करने की जानकारी को ध्यान में रखते हुए कई कार्यक्रमों का एक महत्वपूर्ण हिस्सा है, ऐसी जानकारी पुनर्प्राप्त करने के लिए एक और अधिक कुशल इंटरफ़ेस होना चाहिए। – fdh