2013-04-23 5 views
8

में argv [0] को बदले बिना प्रक्रिया का नाम बदलें मुझे सी भाषा में अपने प्रोग्राम के प्रक्रिया नाम को संशोधित करने की आवश्यकता है।
मैं सटीक हूं, यह उस धागे का नाम नहीं है जिसे मैं बदलना चाहता हूं।
मैं अपने कार्यक्रम का नाम बदलना चाहता हूं, लेकिन मुझे मिला एकमात्र समाधान argv[0] के मान को संशोधित करना है।
मुझे prctl(PR_SET_NAME, "newname") के साथ एक और समाधान मिला, लेकिन यह समाधान काम नहीं करता है।लिनक्स

+0

संभव डुप्लिकेट [कैसे लिनक्स में एक धागा नाम है?] (Http://stackoverflow.com/questions/778085/how-to-name-a-thread-in -linux) – sehe

+0

_ "प्रलेखन का कहना है कि PR_SET_NAME प्रक्रिया का नाम सेट करता है, लेकिन वह दस्तावेज गलत है - यह वास्तव में थ्रेड नाम सेट करता है। अब" शीर्ष "और" ps -L "थ्रेड नाम दिखाता है।" _ - [user9876 22 अप्रैल '0 9 बजे 17:39] (http://stackoverflow.com/questions/778085/how-to-name-a-thread-in-linux#comment588964_778124) – sehe

+2

PR_SET_NAME ध्वज लिनक्स 2.6.9 – akhil

उत्तर

16

prctl और संशोधित argv[0] लागू के बीच मतभेद हैं:

  • संशोधित argv[0] में /proc/$pid/cmdline
  • लागू prctl(PR_SET_NAME) जानकारी बदल जाती है /proc/$pid/status

में जानकारी इसका मतलब है कि आप के अंतर नाम मिल जाएगा बदलता है आपके प्रक्रिया ps -a और ps -ax जारी करने की प्रक्रिया।

यदि आप ps को निष्पादित करते समय विभिन्न तर्कों के लिए समान प्रक्रिया नाम की अपेक्षा करते हैं, तो आप उन्हें दोनों कर सकते हैं (यानी, argv[0] बदलें और prctl को आमंत्रित करें)।

आशा है कि उत्तर मदद करता है।

-1

इस प्रयास करें:

char *process_name = "aaa\0"; 
memcpy((void *)argv[0], process_name, sizeof(process_name)); 

/* व्याख्या करते हैं: अंतरिक्ष argv के लिए आवंटित [0] दिया जाने वाला नाम करना चाहते हैं की तुलना में छोटे हो सकता है और उसके बाद आप कुछ overwritting हो जाएगा अन्य असंबंधित स्मृति। argv [0] आकार केवल 2 हो सकता है और यदि आपका प्रक्रिया नाम "averylongprocessname" है तो आप argv बह रहे होंगे [0]। आपको strlen (argv [0]) की आवश्यकता है और memcpy में इसका उपयोग करें। THX @ecerulm

*/

की
+1

से समर्थित है I लगता है कि \ 0 अनावश्यक है - क्या यह पहले से चुपचाप अक्षर की एक शाब्दिक स्ट्रिंग में शामिल नहीं है? – Chap

+0

@Chap: यह 'strcpy' के लिए सही नहीं है, 'memcpy' के लिए नहीं। –

+1

लगता है कि आपको मूल 'argv [0]' के सभी पात्रों को ओवरराइट करना है, क्या यह सच है? तो आपके पास मूल नाम –