Изменить имя потока на linux (htop)

У меня многопоточное приложение, и я бы хотел, чтобы этот htop (как пример) показывал другое имя для каждого потока, на данный момент он показывает "командную строку", используемую для запуска main.

Я пробовал использовать

prctl(PR_SET_NAME, .....)

но он работает только с вершиной и с этим вызовом возможно только указать имена до 16 байтов.

Я предполагаю, что трюк заключается в изменении содержимого /proc/PID/cmdline, но это поле для чтения.

Кто-нибудь знает, как его достичь?

Ответы

Ответ 1

Начиная с версии 0.8.4, htop имеет возможность: Показывать пользовательские имена потоков

Нажмите F2 и выберите меню Display options. Вы должны увидеть:

htop custom thread names

Ответ 2

Здесь вы должны различать настройку между потоками и каждым процессом.

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 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]));
//}