| PTHREAD_SETNAME_NP(3) | Руководство программиста Linux | PTHREAD_SETNAME_NP(3) | 
pthread_setname_np, pthread_getname_np - изменяет/возвращает имя нити
#define _GNU_SOURCE             /* смотрите feature_test_macros(7) */
#include <pthread.h>
int pthread_setname_np(pthread_t thread, const char *name);
int pthread_getname_np(pthread_t thread,
                       char *name, size_t len);
Компилируется и компонуется вместе с -pthread.
По умолчанию, все нити, созданные pthread_create(), наследуют имя программы. Функция pthread_setname_np() позволяет задать уникальное имя нити, которое можно использовать при отладки многонитевых приложений. Имя нити задаётся по правилам строк языка C, его длина ограничена 16 символами, включая конечный байт null ('\0'). В аргументе thread указывается нить, чьё имя будет изменено; в name указывается новое имя.
Функция pthread_getname_np() возвращает имя нити. В аргументе thread указывает нить, чьё имя будет возвращено. В буфер name возвращается имя нити; в аргументе len указывается количество байт, доступное в name. Длина буфера name должна быть не менее 16 символов. Возвращаемое имя в выходном буфере завершается байтом null.
При успешном выполнении эти функции возвращают 0; при ошибке возвращается ненулевой номер ошибки.
Функция pthread_setname_np() может завершиться со следующей ошибкой:
Функция pthread_getname_np() может завершиться со следующей ошибкой:
Если одна из этих функций завершается с ошибкой открытия /proc/self/task/[tid]/comm, то вызов может завершиться одной из ошибок, описанных в open(2).
Эти функции впервые появились в glibc 2.12.
Описание терминов данного раздела смотрите в attributes(7).
| Интерфейс | Атрибут | Значение | 
| pthread_setname_np(), pthread_getname_np() | Безвредность в нитях | MT-Safe | 
Данные функции являются не стандартизированными расширениями GNU, о чём свидетельствует наличие суффикса «_np» (nonportable).
Запись pthread_setname_np() выполняет через файл нити comm из файловой системы /proc: /proc/self/task/[tid]/comm. Функция pthread_getname_np() также используется его для возврата имени.
Представленная ниже программа показывает использование pthread_setname_np() и pthread_getname_np().
Пример сеанса работы с программой:
$ ./a.out Нить создана. Имя по умолчанию: a.out Имя нити после изменения — THREADFOO. ^Z # Приостановка программы [1]+ Stopped ./a.out $ ps H -C a.out -o 'pid tid cmd comm' PID TID CMD COMMAND 5990 5990 ./a.out a.out 5990 5991 ./a.out THREADFOO $ cat /proc/5990/task/5990/comm a.out $ cat /proc/5990/task/5991/comm THREADFOO
#define _GNU_SOURCE
#include <pthread.h>
#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <errno.h>
#include <stdlib.h>
#define NAMELEN 16
#define errExitEN(en, msg) \
            do { errno = en; perror(msg); exit(EXIT_FAILURE); \
        } while (0)
static void *
threadfunc(void *parm)
{
    sleep(5);          // позволить главной программе изменить имя нити
    return NULL;
}
int
main(int argc, char **argv)
{
    pthread_t thread;
    int rc;
    char thread_name[NAMELEN];
    rc = pthread_create(&thread, NULL, threadfunc, NULL);
    if (rc != 0)
        errExitEN(rc, "pthread_create");
    rc = pthread_getname_np(thread, thread_name, NAMELEN);
    if (rc != 0)
        errExitEN(rc, "pthread_getname_np");
    printf("Нить создана. Имя по умолчанию: %s\n", thread_name);
    rc = pthread_setname_np(thread, (argc > 1) ? argv[1] : "THREADFOO");
    if (rc != 0)
        errExitEN(rc, "pthread_setname_np");
    sleep(2);
    rc = pthread_getname_np(thread, thread_name,
                            (argc > 2) ? atoi(argv[1]) : NAMELEN);
    if (rc != 0)
        errExitEN(rc, "pthread_getname_np");
    printf("Имя нити после изменения — %s.\n", thread_name);
    rc = pthread_join(thread, NULL);
    if (rc != 0)
        errExitEN(rc, "pthread_join");
    printf("Done\n");
    exit(EXIT_SUCCESS);
}
| 2019-03-06 | Linux |