我有一個多線程應用程序,我希望htop(例如)顯示每個正在運行的線程的不同名稱,此刻顯示的是用於運行的「命令行」主要的。在Linux上更改線程名稱(htop)
我一直在使用
prctl(PR_SET_NAME, .....)
嘗試,但它僅適用於頂部,並與呼叫只能指定名稱最多16個字節。
我想訣竅是修改/ proc/PID/cmdline內容,但這是一個只讀字段。
任何人都知道如何實現它?
我有一個多線程應用程序,我希望htop(例如)顯示每個正在運行的線程的不同名稱,此刻顯示的是用於運行的「命令行」主要的。在Linux上更改線程名稱(htop)
我一直在使用
prctl(PR_SET_NAME, .....)
嘗試,但它僅適用於頂部,並與呼叫只能指定名稱最多16個字節。
我想訣竅是修改/ proc/PID/cmdline內容,但這是一個只讀字段。
任何人都知道如何實現它?
您必須在這裏區分每個線程和每個進程的設置。
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]));
//}
自0.8.4版本,htop
有一個選項:顯示自定義線程名
出版社F2並選擇Display options
菜單。您應該看到:
提交者被要求每個線程的設置,不是嗎? – 2013-10-29 17:00:37
爲什麼你只限於argv [0]的長度? – user2815333 2014-04-14 18:04:15