NAME

pthread_setname_np, pthread_getname_np - 스레드 이름 설정하기/얻기

SYNOPSIS

#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로 컴파일 및 링크.

DESCRIPTION

기본적으로 pthread_create(3)를 이용해 만든 스레드들은 모두 프로그램 이름을 물려받는다. pthread_setname_np() 함수를 사용해 스레드에 고유한 이름을 설정할 수 있는데, 다중 스레드 응용을 디버깅 할 때 유용할 수 있다. 스레드 이름은 유의미한 C 문자열로, 종료용 널 바이트('\0') 포함 16개 문자로 길이가 제약되어 있다. thread 인자는 이름을 바꿀 스레드를 나타내고 name은 새 이름을 나타낸다.

pthread_getname_np() 함수를 사용해 스레드의 이름을 얻어올 수 있다. thread 인자는 이름을 가져올 스레드를 나타낸다. 버퍼 name을 이용해 스레드 이름을 반환하며 lenname에서 사용 가능한 바이트 개수를 나타낸다. name으로 지정한 버퍼는 최소 16개 문자 길이여야 한다. 출력 버퍼로 반환되는 스레드 이름은 널로 끝나게 된다.

RETURN VALUE

성공 시 이 함수들은 0을 반환한다. 오류 시 0 아닌 오류 번호를 반환한다.

ERRORS

pthread_setname_np() 함수가 다음 오류로 실패할 수 있다.

ERANGE
name으로 지정한 문자열의 길이가 허용 한계를 초과한다.

pthread_getname_np() 함수가 다음 오류로 실패할 수 있다.

ERANGE
namelen으로 지정한 버퍼가 스레드 이름을 담기에 너무 작다.

이 함수들이 /proc/self/task/[tid]/comm을 여는 데 실패하면 open(2)에서 기술하는 오류들 중 하나로 실패할 수도 있다.

VERSIONS

glibc 버전 2.12에 이 함수들이 처음 등장했다.

ATTRIBUTES

이 절에서 사용하는 용어들에 대한 설명은 attributes(7)를 보라.

인터페이스 속성
pthread_setname_np(),
pthread_getname_np()
스레드 안전성 MT-Safe

CONFORMING TO

이 함수들은 비표준 GNU 확장이다. 그래서 이름 뒤에 "_np"(nonportable: 이식성 없음)가 붙어 있다.

NOTES

내부적으로 pthread_setname_np()/proc 파일 시스템 내의 스레드별 comm 파일인 /proc/self/task/[tid]/comm에 쓰기를 한다. pthread_getname_np()는 같은 위치에서 이름을 가져온다.

EXAMPLES

아래 프로그램이 pthread_setname_np()pthread_getname_np() 사용 방식을 보여 준다.

다음 셸 세션이 프로그램 실행 예를 보여 준다.

$ ./a.out
Created a thread. Default name is: a.out
The thread name after setting it is 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("Created a thread. Default name is: %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("The thread name after setting it is %s.\n", thread_name);

    rc = pthread_join(thread, NULL);
    if (rc != 0)
        errExitEN(rc, "pthread_join");

    printf("Done\n");
    exit(EXIT_SUCCESS);
}

SEE ALSO

prctl(2), pthread_create(3), pthreads(7)


2021-03-22