2010-12-16 6 views
13

पर धागा नाम बदलें मेरे पास एक बहुप्रचार आवेदन है और मैं चाहता हूं कि वह htop (उदाहरण के रूप में) प्रत्येक थ्रेड के प्रति एक अलग नाम दिखाता है, फिलहाल यह दिखाता है कि "कमांड लाइन" चलाने के लिए उपयोग की जाती है मुख्य।लिनक्स (htop)

मैं

prctl(PR_SET_NAME, .....) 

उपयोग करने की कोशिश की है, लेकिन यह तभी संभव 16 बाइट तक नाम निर्दिष्ट किया जाता है केवल शीर्ष के साथ और कहा कि कॉल के साथ काम करता है।

मुझे लगता है कि यह चाल/proc/pID/cmdline सामग्री को संशोधित करना है, लेकिन यह एक पाठक क्षेत्र है।

कोई भी जानता है कि इसे कैसे प्राप्त किया जाए?

उत्तर

5

आपको प्रति-थ्रेड और प्रति-प्रक्रिया सेटिंग के बीच अंतर करना होगा।

prctl (PR_SET_NAME, ...) प्रति-थ्रेड आधार पर नाम (16 बाइट्स तक) सेट करता है, और आप सी स्विच के साथ उस नाम को दिखाने के लिए "ps" को मजबूर कर सकते हैं (उदाहरण के लिए पीएस एचसीएक्स)। आप शीर्ष पर सी स्विच के साथ ऐसा ही कर सकते हैं, इसलिए मुझे लगता है कि htop की समान कार्यक्षमता है।

क्या "पीएस" सामान्य रूप से आपको दिखाता है (उदाहरण के लिए पीएस हैक्स) कमांड लाइन नाम और तर्क है जिसके साथ आपने अपना प्रोग्राम शुरू किया (वास्तव में क्या/proc/pID/cmdline आपको बताता है), और आप सीधे संशोधित करके संशोधित कर सकते हैं argv [0] (इसकी मूल लंबाई तक), लेकिन यह एक प्रति-प्रक्रिया सेटिंग है, जिसका अर्थ है कि आप अलग-अलग धागे को अलग-अलग नाम नहीं दे सकते हैं।

के बाद कोड है मैं सामान्य रूप से एक पूरे के रूप प्रक्रिया नाम बदलने के लिए उपयोग करें:

// procname is the new process name 
char *procname = "new process name"; 

// Then let's directly modify the arguments 
// This needs a pointer to the original arvg, as passed to main(), 
// and is limited to the length of the original argv[0] 
size_t argv0_len = strlen(argv[0]); 
size_t procname_len = strlen(procname); 
size_t max_procname_len = (argv0_len > procname_len) ? (procname_len) : (argv0_len); 

// Copy the maximum 
strncpy(argv[0], procname, max_procname_len); 
// Clear out the rest (yes, this is needed, or the remaining part of the old 
// process name will still show up in ps) 
memset(&argv[0][max_procname_len], '\0', argv0_len - max_procname_len); 

// Clear the other passed arguments, optional 
// Needs to know argv and argc as passed to main() 
//for (size_t i = 1; i < argc; i++) { 
// memset(argv[i], '\0', strlen(argv[i])); 
//} 
+2

सबमिटर प्रति-धागा की स्थापना के लिए पूछ रहा था, नहीं? –

+0

आप अपने आप को argv [0] की लंबाई तक सीमित क्यों करते हैं? – user2815333

16

संस्करण 0.8.4 के बाद से, htop का विकल्प है: दिखाएँ कस्टम धागा नाम

प्रेस एफ 2 और Display options मेनू का चयन करें। आप देखना चाहिए:

htop custom thread names