如何将pthread_t映射到pid(在Linux上)
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何将pthread_t映射到pid(在Linux上)相关的知识,希望对你有一定的参考价值。
有没有理智的方法将pthread_t
值(从pthread_create()
或std::thread::native_hanle()
返回)映射到Linux中的pid(tid)?在某人获得重复开心之前,这不是要找到线程自己的pid(可以使用gettid()
完成)。
疯狂的方式是以某种方式强迫一个线程调用gettid()
并传递结果,但这太麻烦了。
我想到的一个可能的应用是协调在程序中创建的线程(pthread_t
可用)和ps -T
提供的输出。
将pthread_t
映射到tid
而不考虑struct pthread
的一种(复杂的,不可移植的,特定于Linux的,轻度破坏性的)方法如下:
- 使用
pthread_setname_np
将线程名称设置为唯一的名称。 - 迭代
/proc/self/task
的子目录,并从每个文件中名为comm
的文件中读取一行。 - 如果该行等于刚刚使用的唯一字符串,则从子目录名称的最后一个组件中提取
tid
。这是你的答案。
操作系统不会将线程名称用于任何内容,因此更改它应该是安全的。然而,您可能希望将其设置回原来的值(使用pthread_getname_np
来获取它)。
Pthreads是POSIX线程。在pthread_t中,某种类型的long的typedef取决于您的体系结构。它实际上是一个指向内部结构pthread的指针,如上所述。
它的目的是不返回struct pthread。线程高度依赖于底层操作系统。所有Unix风格的操作系统都没有平等地实现线程。我甚至不相信gettid是POSIX函数,我相信它是特定于Linux的。
你可以看一下glibc / nptl源代码,用于linux特定的struct pthread实现。参见https://sourceware.org/git/?p=glibc.git;a=blob;f=nptl/descr.h;h=fdeb397eab94730a5dab3181abcdae815ed6914e;hb=48a8f8328122ab8d06b7333cb87be46feeaf7cca
但我相信你所寻找的是getpid。它是进程ID而不是线程ID
以上是关于如何将pthread_t映射到pid(在Linux上)的主要内容,如果未能解决你的问题,请参考以下文章