mount_setattr.2: Minor tweaks to Christian's patch
[man-pages.git] / man3 / pthread_setname_np.3
blob77c18a3cfb00f674c5da5803d67301d9104fcf78
1 .\" Copyright (C) 2012 Chandan Apsangi <chandan.jc@gmail.com>
2 .\" and Copyright (C) 2013 Michael Kerrisk <mtk.manpages@gmail.com>
3 .\"
4 .\" %%%LICENSE_START(VERBATIM)
5 .\" Permission is granted to make and distribute verbatim copies of this
6 .\" manual provided the copyright notice and this permission notice are
7 .\" preserved on all copies.
8 .\"
9 .\" Permission is granted to copy and distribute modified versions of this
10 .\" manual under the conditions for verbatim copying, provided that the
11 .\" entire resulting derived work is distributed under the terms of a
12 .\" permission notice identical to this one.
13 .\"
14 .\" Since the Linux kernel and libraries are constantly changing, this
15 .\" manual page may be incorrect or out-of-date.  The author(s) assume no
16 .\" responsibility for errors or omissions, or for damages resulting from
17 .\" the use of the information contained herein.  The author(s) may not
18 .\" have taken the same level of care in the production of this manual,
19 .\" which is licensed free of charge, as they might when working
20 .\" professionally.
21 .\"
22 .\" Formatted or processed versions of this manual, if unaccompanied by
23 .\" the source, must acknowledge the copyright and authors of this work.
24 .\" %%%LICENSE_END
25 .\"
26 .TH PTHREAD_SETNAME_NP 3 2021-03-22 "Linux" "Linux Programmer's Manual"
27 .SH NAME
28 pthread_setname_np, pthread_getname_np \- set/get the name of a thread
29 .SH SYNOPSIS
30 .nf
31 .BR "#define _GNU_SOURCE" "             /* See feature_test_macros(7) */"
32 .B #include <pthread.h>
33 .PP
34 .BI "int pthread_setname_np(pthread_t " thread ", const char *" name );
35 .BI "int pthread_getname_np(pthread_t " thread ", char *" name ", size_t " len );
36 .fi
37 .PP
38 Compile and link with \fI\-pthread\fP.
39 .SH DESCRIPTION
40 By default, all the threads created using
41 .BR pthread_create ()
42 inherit the program name.
43 The
44 .BR pthread_setname_np ()
45 function can be used to set a unique name for a thread,
46 which can be useful for debugging
47 multithreaded applications.
48 The thread name is a meaningful C language string, whose length is
49 restricted to 16 characters, including the terminating null byte (\(aq\e0\(aq).
50 The
51 .I thread
52 argument specifies the thread whose name is to be changed;
53 .I name
54 specifies the new name.
55 .PP
56 The
57 .BR pthread_getname_np ()
58 function can be used to retrieve the name of the thread.
59 The
60 .I thread
61 argument specifies the thread whose name is to be retrieved.
62 The buffer
63 .I name
64 is used to return the thread name;
65 .I len
66 specifies the number of bytes available in
67 .IR name .
68 The buffer specified by
69 .I name
70 should be at least 16 characters in length.
71 The returned thread name in the output buffer will be null terminated.
72 .SH RETURN VALUE
73 On success, these functions return 0;
74 on error, they return a nonzero error number.
75 .SH ERRORS
76 The
77 .BR pthread_setname_np ()
78 function can fail with the following error:
79 .TP
80 .B ERANGE
81 The length of the string specified pointed to by
82 .I name
83 exceeds the allowed limit.
84 .PP
85 The
86 .BR pthread_getname_np ()
87 function can fail with the following error:
88 .TP
89 .B ERANGE
90 The buffer specified by
91 .I name
92 and
93 .I len
94 is too small to hold the thread name.
95 .PP
96 If either of these functions fails to open
97 .IR /proc/self/task/[tid]/comm ,
98 then the call may fail with one of the errors described in
99 .BR open (2).
100 .SH VERSIONS
101 These functions first appeared in glibc in version 2.12.
102 .SH ATTRIBUTES
103 For an explanation of the terms used in this section, see
104 .BR attributes (7).
105 .ad l
108 allbox;
109 lbx lb lb
110 l l l.
111 Interface       Attribute       Value
113 .BR pthread_setname_np (),
114 .BR pthread_getname_np ()
115 T}      Thread safety   MT-Safe
119 .sp 1
120 .SH CONFORMING TO
121 These functions are nonstandard GNU extensions;
122 hence the suffix "_np" (nonportable) in the names.
123 .SH NOTES
124 .BR pthread_setname_np ()
125 internally writes to the thread-specific
126 .I comm
127 file under the
128 .IR /proc
129 filesystem:
130 .IR /proc/self/task/[tid]/comm .
131 .BR pthread_getname_np ()
132 retrieves it from the same location.
133 .SH EXAMPLES
134 The program below demonstrates the use of
135 .BR pthread_setname_np ()
137 .BR pthread_getname_np ().
139 The following shell session shows a sample run of the program:
141 .in +4n
143 .RB "$" " ./a.out"
144 Created a thread. Default name is: a.out
145 The thread name after setting it is THREADFOO.
146 \fB\(haZ\fP                           # Suspend the program
147 [1]+  Stopped           ./a.out
148 .RB "$ " "ps H \-C a.out \-o \(aqpid tid cmd comm\(aq"
149   PID   TID CMD                         COMMAND
150  5990  5990 ./a.out                     a.out
151  5990  5991 ./a.out                     THREADFOO
152 .RB "$ " "cat /proc/5990/task/5990/comm"
153 a.out
154 .RB "$ " "cat /proc/5990/task/5991/comm"
155 THREADFOO
158 .SS Program source
161 #define _GNU_SOURCE
162 #include <pthread.h>
163 #include <stdio.h>
164 #include <string.h>
165 #include <unistd.h>
166 #include <errno.h>
167 #include <stdlib.h>
169 #define NAMELEN 16
171 #define errExitEN(en, msg) \e
172                         do { errno = en; perror(msg); \e
173                              exit(EXIT_FAILURE); } while (0)
175 static void *
176 threadfunc(void *parm)
178     sleep(5);          // allow main program to set the thread name
179     return NULL;
183 main(int argc, char *argv[])
185     pthread_t thread;
186     int rc;
187     char thread_name[NAMELEN];
189     rc = pthread_create(&thread, NULL, threadfunc, NULL);
190     if (rc != 0)
191         errExitEN(rc, "pthread_create");
193     rc = pthread_getname_np(thread, thread_name, NAMELEN);
194     if (rc != 0)
195         errExitEN(rc, "pthread_getname_np");
197     printf("Created a thread. Default name is: %s\en", thread_name);
198     rc = pthread_setname_np(thread, (argc > 1) ? argv[1] : "THREADFOO");
199     if (rc != 0)
200         errExitEN(rc, "pthread_setname_np");
202     sleep(2);
204     rc = pthread_getname_np(thread, thread_name,
205                             (argc > 2) ? atoi(argv[1]) : NAMELEN);
206     if (rc != 0)
207         errExitEN(rc, "pthread_getname_np");
208     printf("The thread name after setting it is %s.\en", thread_name);
210     rc = pthread_join(thread, NULL);
211     if (rc != 0)
212         errExitEN(rc, "pthread_join");
214     printf("Done\en");
215     exit(EXIT_SUCCESS);
218 .SH SEE ALSO
219 .ad l
221 .BR prctl (2),
222 .BR pthread_create (3),
223 .BR pthreads (7)