Linux pthread_setname_np失败,错误号为2

Linux pthread_setname_np失败,错误号为2,linux,multithreading,Linux,Multithreading,我想设置我的线程名,我检查我的linux glibc verison是2.12,包括pthread_setname_np API,但是我在执行pthread_setname_np时得到了错误2,我发现2是ENONT,意思是“没有这样的文件或目录”。我不明白。但我在同一代码中发现,pthread_setname_np在另一个linux系统中返回成功。 退货成功的版本信息: root@Gzpeak:/home/wzx/thread#uname-a Linux Gzpeak 3.13.0-86-gen

我想设置我的线程名,我检查我的linux glibc verison是2.12,包括pthread_setname_np API,但是我在执行pthread_setname_np时得到了错误2,我发现2是ENONT,意思是“没有这样的文件或目录”。我不明白。但我在同一代码中发现,pthread_setname_np在另一个linux系统中返回成功。
退货成功的版本信息:
root@Gzpeak:/home/wzx/thread#uname-a
Linux Gzpeak 3.13.0-86-generic#130 Ubuntu SMP周一4月18日18:27:15 UTC 2016 x86_64 x86_64 x86_64 GNU/Linux
root@Gzpeak:/home/wzx/thread#cat/proc/version
Linux版本3.13.0-86-generic(buildd@lgw01-19) (gcc版本4.8.2(Ubuntu 4.8.2-19ubuntu1))#130 Ubuntu SMP周一UTC 2016年4月18日18:27:15
root@Gzpeak:/home/wzx/thread#getconf GNU_LIBC_VERSION
glibc 2.19
返回错误的版本信息:
[root@localhostwzx]#uname-a
Linux localhost.localdomain 2.6.32-279.el6.x86#u 64#1 SMP周三6月13日18:24:36美国东部夏令时2012年x86_64 x86_64#u 64 GNU/Linux
[root@localhostwzx]#cat/proc/version
Linux版本2.6.32-279.el6.x86_64(mockbuild@x86-008.build.bos.redhat.com)(gcc版本4.4.6 20120305(Red Hat 4.4.6-4)(gcc))#1 SMP周三6月13日18:24:36美国东部夏令时2012
[root@localhostwzx]#getconf gnuu LIBC_版本 glibc 2.12

请有人告诉我,谢谢你的建议

可能您没有启动线程,或者启动线程失败,或者线程已经完成

pthread_setname_np无法打开/proc/self/task/[tid]/comm,那么调用可能会失败,出现open(2)中描述的错误之一

在连接终止的线程或终止分离的线程后,系统可以重用线程ID。POSIX说:“如果应用程序试图使用其生命周期已结束的线程ID,则该行为是未定义的。”


我在第页找到了答案,“
/proc/[pid]/task/[tid]/comm
”文件仅在Linux2.6.33之后才存在。第二个linux版本是2.6.32,因此pthread_setname_np返回错误,尽管glibc是v2.12。顺便说一句,@galka谢谢你的建议,给我一个找到答案的方法。

我发现我的代码在另一个linux系统中工作,我在问题中给出了其中两个版本信息,你能给我更多建议吗?你是说你在更新的内核和glibc上获得了成功。手册页上写着Glibc2.12。中有一个示例程序。你在第二台Linux上运行过吗?如果它没有失败,你在你的程序中做错了smth,如果它没有失败,你有一个不同的故事。不看你的代码,我可能会建议:试着调试你的程序:使用strace-fp,gdb,在启动线程之前和之后做一些printfs,完成线程,更改名称,在线程中添加一些sleep(),在“不幸运”的Linux系统上更改名称时确保它是活动的。我找到了答案,正如你所建议的,第二个Linux版本是2.6.32,和“/proc/[pid]/task/[tid]/com”文件仅在2.6.33之后存在。谢谢你的建议。