【问题标题】:How to map pthread_t to pid (on Linux)如何将 pthread_t 映射到 pid(在 Linux 上)
【发布时间】:2018-05-28 18:20:38
【问题描述】:

在 Linux 中,有没有一种健全的方法可以将 pthread_t 值(从 pthread_create()std::thread::native_hanle() 返回)映射到 pid(tid)?在某人变得重复快乐之前,这不是关于查找线程自己的 pid(可以通过 gettid() 完成)。

疯狂的方法是强制线程调用gettid() 并传递结果,但这太麻烦了。

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

【问题讨论】:

  • 据我所知,在linux中,pthread_t是一个指向struct pthread的指针,它有一个tid成员。但我不知道任何可接受的方式来阅读这些信息。如果你有可用的调试符号,你可以在 gdb 中使用ptype pthread 检出这个结构。仅出于调试目的,您可以使用p &((pthread*)0)->tid 读取tid 的偏移量,然后在程序本身中使用此偏移量从pthread_t 读取tid。或者您可以使用一些矮人阅读器库从符号文件本身读取偏移量,以实现“便携”。
  • @geza 确实很有趣,感谢您提供这些信息!
  • 这取决于线程的底层实现。 linuxthreads 可能有与之关联的进程 ID,getpid 应该返回它。 posix 线程可能不会,所以getpid 将返回主进程的 pid。检查这个:stackoverflow.com/a/19677227/1143850
  • 几个骗子exhibit Aexhibit B
  • @n.m.你的回答提供了一个很好的多样性,从“你不能这样做,因为 pthreads 不是 Linux 线程”作为共识非回答。

标签: c++ c linux pthreads


【解决方案1】:

在不查看struct pthread 的情况下将pthread_t 映射到tid 的一种(复杂的、非便携式的、特定于Linux 的、轻微破坏性的)方法如下:

  1. 使用pthread_setname_np 将线程名称设置为唯一的名称。
  2. 遍历/proc/self/task 的子目录并从每个子目录中的comm 文件中读取一行。
  3. 如果该行等于刚刚使用的唯一字符串,则从子目录名称的最后一个组件中提取tid。这是你的答案。

操作系统不会将线程名称用于任何用途,因此更改它应该是安全的。尽管如此,您可能希望将其设置回原来的值(使用pthread_getname_np 获取它)。

【讨论】:

  • 事实上,我的线程已经有了名字,所以这种方法当然值得考虑。接受。
【解决方案2】:

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

【讨论】:

    【解决方案3】:

    Pthreads 是 POSIX 线程。 根据您的体系结构, pthread_t 是某种类型的 long 类型定义。 它实际上是一个类型转换为内部结构 pthread 的指针,如上所述。

    故意不返回struct pthread。 线程高度依赖于底层操作系统。在所有 Unix 风格的操作系统上,线程的实现并不相同。 我什至不相信 gettid 是 POSIX 函数,我相信它是特定于 Linux 的。

    您可以查看 glibc/nptl source code for linux specific implementation of struct pthread 见https://sourceware.org/git/?p=glibc.git;a=blob;f=nptl/descr.h;h=fdeb397eab94730a5dab3181abcdae815ed6914e;hb=48a8f8328122ab8d06b7333cb87be46feeaf7cca

    但我相信您正在寻找的是 getpid。它是进程ID而不是线程ID

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-08-20
      • 1970-01-01
      • 2012-04-12
      • 1970-01-01
      • 2011-03-30
      • 2019-03-02
      • 2011-02-10
      • 1970-01-01
      相关资源
      最近更新 更多