2010-12-16 74 views
13

我有一個多線程應用程序,我希望htop(例如)顯示每個正在運行的線程的不同名稱,此刻顯示的是用於運行的「命令行」主要的。在Linux上更改線程名稱(htop)

我一直在使用

prctl(PR_SET_NAME, .....) 

嘗試,但它僅適用於頂部,並與呼叫只能指定名稱最多16個字節。

我想訣竅是修改/ proc/PID/cmdline內容,但這是一個只讀字段。

任何人都知道如何實現它?

回答

5

您必須在這裏區分每個線程和每個進程的設置。

prctl(PR_SET_NAME,...)在每個線程的基礎上設置名稱(最多16個字節),並且可以強制「ps」使用c開關(例如ps Hcx)顯示該名稱。你可以用頂部的c開關來做同樣的事情,所以我認爲htop具有類似的功能。

什麼「ps」通常顯示你(ps hax例如)是命令行的名稱和你啓動程序的參數(實際上是什麼/ proc/PID/cmdline告訴你),你可以通過直接修改argv [0](直到它的原始長度),但這是一個per-process設置,這意味着你不能以這種方式爲不同的線程指定不同的名稱。

以下是代碼,我通常使用的改變進程名作爲一個整體:

// 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

提交者被要求每個線程的設置,不是嗎? – 2013-10-29 17:00:37

+0

爲什麼你只限於argv [0]的長度? – user2815333 2014-04-14 18:04:15

16

自0.8.4版本,htop有一個選項:顯示自定義線程名

出版社F2並選擇Display options菜單。您應該看到:

htop custom thread names