在linux上更改线程名称(htop)

时间:2010-12-16 13:37:40

标签: c linux pthreads

我有一个多线程应用程序,我希望htop(例如)每个运行的线程显示一个不同的名称,此时显示的是用于运行main的“命令行”。

我尝试过使用

prctl(PR_SET_NAME, .....)

但它仅适用于top,只有该调用才能指定最多16个字节的名称。

我想诀窍是修改/ proc / PID / cmdline内容,但这是一个只读字段。

任何人都知道如何实现它?

2 个答案:

答案 0 :(得分:20)

从版本0.8.4开始,htop有一个选项:显示自定义线程名称

F2 并选择Display options菜单。你应该看到:

htop custom thread names

答案 1 :(得分:5)

您必须在此处区分每个线程和每个进程的设置。

prctl(PR_SET_NAME,...)在每个线程的基础上设置名称(最多16个字节),您可以强制“ps”用c开关显示该名称(例如ps Hcx)。您可以使用顶部的c开关执行相同的操作,因此我假设htop具有类似的功能。

“ps”通常显示的内容(例如ps Hax)是命令行名称和你启动程序的参数(实际上是/ 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]));
//}