有没有一种明智的方法将 pthread_create()
或 std::thread::native_handle()
返回的 pthread_t
值映射到 Linux 中的 pid(tid)?在有人重复提交之前,这与查找线程自身的pid(tid)无关(可以使用gettid()
实现)。
疯狂的方法是以某种方式强制线程调用gettid()
并传递结果,但那太麻烦了。
我心中可能的一个应用是将程序创建的线程(其中可用pthread_t
)与ps -T
提供的输出进行协调。
将 pthread_t
映射到 tid
的一种方法(复杂、不可移植、仅适用于Linux,会轻微破坏)而不查看 struct pthread
是:
pthread_setname_np
将线程名称设置为唯一的内容。/proc/self/task
子目录并从每个子目录中读取名为 comm
的文件中的一行。tid
。 这就是你的答案。操作系统不使用线程名称,因此更改它应该是安全的。 但是,您可能希望将其设置回原始值(使用 pthread_getname_np
获取它)。
process_vm_readv
系统调用。如果您知道pthread_t
,请使用它将内存从远程进程复制到本地缓冲区,然后将指针转换为struct pthread
并检索tid
字段的值。Pthreads是POSIX线程。
在pthread_t中,根据您的架构,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
是指向struct pthread
的指针,该结构体有一个成员变量tid
。但我不知道任何可接受的方法来读取这个信息。如果您有可用的调试符号,可以在gdb中使用ptype pthread
来检查这个结构体。仅限于调试目的,您可以使用p &((pthread*)0)->tid
来读取tid
的偏移量,然后在程序本身中使用此偏移量来读取pthread_t
中的tid
。或者,您可以使用某些dwarf reader库从符号文件本身中读取偏移量,以实现“可移植性”。 - geza