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é)
- 使用pthread_setname_np設(shè)置線程名要注意字符長度恕沫,包含“\0”不能超過16個
- 可以根據(jù)返回值來判斷設(shè)置成功或失敗
- 也可以用系統(tǒng)調(diào)用prctl(PR_SET_NAME)函數(shù)設(shè)置線程名,但也要注意字符不能超過16個