2012-02-01 18 views
18

मैं सी में प्रक्रिया का नाम कैसे प्राप्त कर सकता हूं? वही नाम, जो /proc/$pid/status में है। मैं उस फाइल को पार्स नहीं करना चाहता हूं। क्या ऐसा करने का कोई प्रोग्रामेटिक तरीका है?लिनक्स में वर्तमान प्रक्रिया नाम कैसे प्राप्त करें?

उत्तर

21

या तो argv[0] द्वारा इंगित किया गया है या वास्तव में आप /proc/self/status पढ़ सकते हैं। या आप getenv("_") का उपयोग कर सकते हैं, यह सुनिश्चित नहीं है कि कौन इसे सेट करता है और यह कितना विश्वसनीय है।

+2

ध्यान दें कि 'getenv ("_")' मूल रूप से खोल द्वारा शुरू की गई प्रक्रिया को वापस करने के लिए प्रतीत होता है - अगर मैं इसे 'मेक' द्वारा शुरू की गई प्रक्रिया में कॉल करता हूं, तो मुझे "/ usr/bin/make" दिखाई देता है, बल्कि मेरे प्रक्रिया का नाम। इसका मतलब है कि यह शायद खोल द्वारा निर्धारित है। –

+0

@RogerLipscombe, वास्तव में अच्छा अवलोकन। –

5

argv[0] के मान को देखें जो main पर भेजा गया था। यह वह नाम होना चाहिए जिसके अंतर्गत आपकी प्रक्रिया लागू की गई थी।

+1

Unfortunatelly इस मामले मैं न argv करने के लिए [0] – Mariusz

+2

@Mariusz तो फिर तुम proc के माध्यम से जाना करने जा रहे हैं उपयोग किया है में - हालांकि मैं 'सलाह देते हैं/proc/self/cmdline'। – Borealid

+0

@ मारियसज़, आप 'getenv ("_") भी कोशिश कर सकते हैं, हालांकि मुझे यकीन नहीं है कि यह कितना विश्वसनीय है। –

9

आप __progname का उपयोग कर सकते हैं। हालांकि यह argv[0] से बेहतर नहीं है क्योंकि इसमें पोर्टेबिलिटी समस्याएं हो सकती हैं। लेकिन यह इस प्रकार काम कर सकते हैं के रूप में आप argv[0] लिए पहुँच नहीं है: -

extern char *__progname; 
printf("\n%s", __progname); 
33

आप एक glibc का उपयोग कर, तो पर हैं:

#define _GNU_SOURCE 
#include <errno.h> 

extern char *program_invocation_name; 
extern char *program_invocation_short_name; 

program_invocation_name देखें (3)

अधिकांश इकाइयों के तहत, __progname भी libc द्वारा परिभाषित किया गया है। एकमात्र पोर्टेबल रास्ता argv [main() में], क्योंकि आप एक पुस्तकालय को लागू कर रहे हैं, तो आप कर सकते हैं का उपयोग करने के argv[0]

5

मैं अक्सर निम्नलिखित कॉल का इस्तेमाल करते हैं,

char* currentprocname = getprogname(); 
+3

यह बीएसडी-विशिष्ट है। आप इसे 'libbsd' के साथ लिनक्स पर प्राप्त कर सकते हैं, लेकिन यह libc का हिस्सा नहीं है क्योंकि यह फ्रीबीएसडी या ओएस एक्स – Cairnarvon

1

आप नहीं पहुंच पा रहे है एक समान प्रश्न here पर मेरे उत्तर पर एक नज़र डालें।

यह मूल रूप से आपको मुख्य() के बाहर argc, argv [] और envp [] तक पहुंच प्रदान करने में उबलता है। फिर आप कर सकते हैं, जैसा कि दूसरों ने पहले से ही सही ढंग से सुझाव दिया है, प्रक्रिया नाम पुनर्प्राप्त करने के लिए argv [0] का उपयोग करें।

+0

पर है या आप/proc/self/cmdline देख सकते हैं – liang

0

यह एक ऐसा संस्करण है जो मैकोज़, फ्रीबीएसडी और लिनक्स पर काम करता है।

#if defined(__APPLE__) || defined(__FreeBSD__) 
const char * appname = getprogname(); 
#elif defined(_GNU_SOURCE) 
const char * appname = program_invocation_name; 
#else 
const char * appname = "?"; 
#endif 
संबंधित मुद्दे