为何pthread_setname_np与PR_SET_NAME被限制为16字节?
为什么pthread_setname_np与PR_SET_NAME被限制为16字节?
这俩接口的限制来自内核对线程名称存储字段的固定定义,和你看到的长进程名根本不是一回事:
PR_SET_NAME(用于设置线程名,包括进程的主线程)和pthread_setname_np操作的是内核线程描述符里的comm字段,这个字段被内核定义为char comm[TASK_COMM_LEN],其中TASK_COMM_LEN的值就是16——这包含了字符串终止符,所以实际能写入的有效字符只有15个。这个字段是给内核调度、ps/top这类工具显示线程信息用的,属于内核级的固定长度限制,没法突破。你看到的
systemd-timesyncd这类超过16字节的“进程名”,其实是进程的**argv[0]参数**(也就是启动时传入的第一个命令行参数),对应/proc/[pid]/cmdline里的内容。这部分是用户态存储的,没有16字节的限制,只要内存够就能用任意长度。很多工具在显示进程信息时,会优先显示argv[0]的内容,而非内核的comm字段,这才让你觉得“进程名更长”——本质上这两个是完全不同的名称字段。
举个例子,你可以用ps -Lp [pid]查看某个进程的线程信息,会发现主线程的COMM列是被截断到15个字符的,而CMD列显示的是完整的argv[0]内容。
内容的提问来源于stack exchange,提问作者hanshenrik
相关产品推荐
相关产品推荐

