pthread_setname_np設(shè)置線程名失敗原因分析

pthread_setname_np函數(shù)源碼

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;
    //以下如果要設(shè)置的線程名超過15個則設(shè)置失敗
    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;
}

從源碼來看,設(shè)置的線程名如果長度>15,則會返回ERANGE錯誤碼,否則才會調(diào)用prctl(PR_SET_NAME)設(shè)置線程名,如果設(shè)置失敗的話,會使用父線程名;因為子線程是從父線程clone出來的,線程名會默認(rèn)繼承父線程名。

if ((len = strnlen(name, 16)) > 15) return ERANGE;

總結(jié)

  1. 使用pthread_setname_np設(shè)置線程名要注意字符長度,包含“\0”不能超過16個
  2. 可以根據(jù)返回值來判斷設(shè)置成功或失敗
  3. 也可以用系統(tǒng)調(diào)用prctl(PR_SET_NAME)函數(shù)設(shè)置線程名,但也要注意字符不能超過16個
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容