2017-03-08 132 views
1

我想设置我的线程名称,并检查我的linux glibc版本是2.12,包括pthread_setname_np API,但是当执行pthread_setname_np时我得到了errno 2,我发现2是ENOENT,意思是“无此文件或目录”。我不明白。但是我发现在我的相同代码中,pthread_setname_np在另一个linux系统中返回成功。
回报成功的版本信息:
根@ Gzpeak:/家庭/ WZX /线程#UNAME -a
Linux的Gzpeak 3.13.0-86泛型#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 version 3.13.0-86-generic(buildd @ lgw01-19)(gcc version 4.8 0.2(Ubuntu的4.8.2-19ubuntu1))#130-Ubuntu的SMP星期一年04月18 18点27分15秒UTC 2016
根@ Gzpeak:/家庭/ WZX /线程#getconf GNU_LIBC_VERSION
的glibc 2.19

返回错误的版本信息:
[根@本地WZX] #uname -a
的Linux的localhost.localdomain 2.6.32-279.el6.x86_64#1 SMP周三6月13日18:24: 36 EDT 2012 x86_64 x86_64 x86_64 GNU/Linux
[root @ localhost wzx]#cat/proc/version
Linux版本2.6.32-279.el6.x86_64([email protected] )(gcc版本4.4.6 20120305(Red Hat 4.4.6-4)(GCC))#1 SMP Wed Jun 13 18:24:36 EDT 2012
[root @ localhost wzx]#getconf GNU_LIBC_VERSION glibc 2.12

请有人告诉我,坦克你的任何意见。pthread_setname_np失败,errno是2

回答

1

我找到了答案在proc5页的 “的/ proc/[PID] /任务/ [TID]/COM” 文件只存在由于Linux 2.6.33。第二个linux版本是2.6.32,所以pthread_setname_np返回错误,虽然glibc是v2.12。顺便说一句,@galka感谢您的建议,给我一种方法来找到答案。

0

也许你没有或没有启动一个线程或它已经完成。

pthread_setname_np fails to open /proc/self/task/[tid]/comm, then the call may fail with one of the errors described in open(2)

The system may reuse a thread ID after a terminated thread has been joined, or a detached thread has terminated. POSIX says: "If an application attempts to use a thread ID whose lifetime has ended, the behavior is undefined."

+0

我发现我的代码在另一个linux系统中工作,我给了他们两个版本信息在我的问题中,你能给我更多的建议吗? – husker

+0

所以你说你在新的内核和glibc上取得成功。手册页说glibc 2.12。 http://man7.org/linux/man-pages/man3/pthread_setname_np.3.html中有一个示例程序。你有没有在第二台Linux上运行它?如果它没有失败,那么你在程序中做错了,如果它确实有不同的故事。不用看看你的代码,我可能会建议:尝试调试你的程序:用strace -fp,gdb,在启动线程之前和之后做一些printfs,完成线程,更改名称,添加一些sleep()到线程,确保当你在'不幸'的Linux系统上更改它的名字时它仍然活着。 – galka

+0

我发现你的建议的答案,第二个Linux版本是2.6.32,“/ proc/[pid] /任务/ [tid]/com”文件只存在自2.6.33。感谢您的建议。 – husker

相关问题