pthread_setname_np函数源码
int pthread_setname_np(pthread_t thread, const char *name)
{
int fd, cs, status = 0;
char f[sizeof "/proc/self/task//comm" + 3*sizeof(int)];
size_t len;
//以下如果要设置的线程名超过15个则设置失败
if ((len = strnlen(name, 16)) > 15) return ERANGE;
if (thread == pthread_self())
return prctl(PR_SET_NAME, (unsigned long)name, 0UL, 0UL, 0UL) ? errno : 0;
snprintf(f, sizeof f, "/proc/self/task/%d/comm", thread->tid);
pthread_setcancelstate(PTHREAD_CANCEL_DISABLE, &cs);
if ((fd = open(f, O_WRONLY|O_CLOEXEC)) < 0 || write(fd, name, len) < 0) status = errno;
if (fd >= 0) close(fd);
pthread_setcancelstate(cs, 0);
return status;
}
从源码来看,设置的线程名如果长度>15,则会返回ERANGE错误码,否则才会调用prctl(PR_SET_NAME)设置线程名,如果设置失败的话,会使用父线程名;因为子线程是从父线程clone出来的,线程名会默认继承父线程名。
if ((len = strnlen(name, 16)) > 15) return ERANGE;
总结
- 使用pthread_setname_np设置线程名要注意字符长度,包含“\0”不能超过16个
- 可以根据返回值来判断设置成功或失败
- 也可以用系统调用prctl(PR_SET_NAME)函数设置线程名,但也要注意字符不能超过16个