如何将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的,轻度破坏性的)方法如下:

  1. 使用pthread_setname_np将线程名称设置为唯一的名称。
  2. 迭代/proc/self/task的子目录,并从每个文件中名为comm的文件中读取一行。
  3. 如果该行等于刚刚使用的唯一字符串,则从子目录名称的最后一个组件中提取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上)的主要内容,如果未能解决你的问题,请参考以下文章

Linux中多线程,同步将一个文件内容复制到另一个文件里面

启动后将 pid 映射到 qdbus 服务号

我如何将 linux 系统调用映射到功能

Linux多线程操作pthread_t

Linux多线程操作pthread_t

Linux多线程操作pthread_t