Ответ 1
Начиная с версии 0.8.4, htop
имеет возможность: Показывать пользовательские имена потоков
Нажмите F2 и выберите меню Display options
. Вы должны увидеть:
У меня многопоточное приложение, и я бы хотел, чтобы этот htop (как пример) показывал другое имя для каждого потока, на данный момент он показывает "командную строку", используемую для запуска main.
Я пробовал использовать
prctl(PR_SET_NAME, .....)
но он работает только с вершиной и с этим вызовом возможно только указать имена до 16 байтов.
Я предполагаю, что трюк заключается в изменении содержимого /proc/PID/cmdline, но это поле для чтения.
Кто-нибудь знает, как его достичь?
Начиная с версии 0.8.4, htop
имеет возможность: Показывать пользовательские имена потоков
Нажмите F2 и выберите меню Display options
. Вы должны увидеть:
Здесь вы должны различать настройку между потоками и каждым процессом.
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]));
//}