如何将pthread_t映射到pid(在Linux上)

时间:2017-12-14 15:39:42

标签: c++ c linux pthreads

是否有一种明智的方法可以将pthread_t值(从pthread_create()std::thread::native_hanle()返回)映射到Linux中的pid(tid)?在某人获得重复开心之前,这是关于查找线程自己的pid(可以使用gettid()完成)。

疯狂的方式是以某种方式迫使线程调用gettid()并传递结果,但这太麻烦了。

我想到的一个可能的应用是协调在程序中创建的线程(pthread_t可用的地方)与ps -T提供的输出。

3 个答案:

答案 0 :(得分:3)

pthread_t映射到tid而不查看struct pthread的一种(复杂的,不可移植的,特定于Linux的,轻度破坏性的)方法如下:

  1. 使用pthread_setname_np将线程名称设置为唯一的。
  2. 遍历/proc/self/task的子目录,并从每个文件中名为comm的文件中读取一行。
  3. 如果该行等于刚刚使用的唯一字符串,则从子目录名称的最后一个组件中提取tid。这是你的答案。
  4. 操作系统不会将线程名称用于任何内容,因此更改它应该是安全的。不过,您可能希望将其设置回原来的值(使用pthread_getname_np来获取它)。

答案 1 :(得分:0)

在 Linux 上使用 process_vm_readv 系统调用是一种有点老套的方法。如果您知道 pthread_t,请使用它将内存从远程进程复制到本地缓冲区,然后将指针转换为 struct pthread 并检索 tid 字段的值。

答案 2 :(得分:-1)

Pthreads是POSIX线程。 在pthread_t中,某种类型的long的typedef取决于您的体系结构。 它实际上是一个指向内部struct pthread的指针,如上所述。

故意不返回struct pthread。 线程高度依赖于底层操作系统。所有Unix风格的操作系统都没有平等地实现线程。 我甚至不相信gettid是POSIX函数,我相信它是特定于Linux的。

您可以查看glibc / nptl源代码,了解linux pthread的linux特定实现 见https://sourceware.org/git/?p=glibc.git;a=blob;f=nptl/descr.h;h=fdeb397eab94730a5dab3181abcdae815ed6914e;hb=48a8f8328122ab8d06b7333cb87be46feeaf7cca

但我相信你所寻找的是getpid。它是进程ID而不是线程ID