Здесь необходимо различать настройки для каждого потока и для каждого процесса.
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]));
//}