изменить имя потока в Linux (htop) - PullRequest
14 голосов
/ 16 декабря 2010

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

Я пытался использовать

prctl(PR_SET_NAME, .....)

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

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

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

Ответы [ 2 ]

20 голосов
/ 02 февраля 2014

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

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

htop custom thread names

5 голосов
/ 16 декабря 2010

Здесь необходимо различать настройки для каждого потока и для каждого процесса.

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]));
//}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...