pthread_setname_np设置线程名失败原因分析

2023-07-21  本文已影响0人  seekting

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;

总结

  1. 使用pthread_setname_np设置线程名要注意字符长度,包含“\0”不能超过16个
  2. 可以根据返回值来判断设置成功或失败
  3. 也可以用系统调用prctl(PR_SET_NAME)函数设置线程名,但也要注意字符不能超过16个
上一篇 下一篇

猜你喜欢

热点阅读