如果有任何“智能”方法来获取在进程中使用threadID
创建的所有pthread_created
,请使用pthreads,假设这些线程是在第三方库中创建的,不会公开这些数据
答案 0 :(得分:7)
一种方法是为pthread_create创建替换函数,并使用LD_PRELOAD。 当然你不想重新实现pthread_create,所以你必须以某种方式调用pthread_create,但你可以要求动态加载器为你加载它:
#define _GNU_SOURCE
#include <stdio.h>
#include <stdint.h>
#include <bits/pthreadtypes.h>
#include <dlfcn.h>
void store_id(pthread_t * id) {
fprintf(stderr, "new thread created with id 0x%lx\n", (*id));
}
#undef pthread_create
int pthread_create(pthread_t * thread, pthread_attr_t * attr, void * (*start)(void *), void * arg)
{
int rc;
static int (*real_create)(pthread_t * , pthread_attr_t *, void * (*start)(void *), void *) = NULL;
if (!real_create)
real_create = dlsym(RTLD_NEXT, "pthread_create");
rc = real_create(thread, attr, start, arg);
if(!rc) {
store_id(thread);
}
return rc;
}
然后将其编译为共享库:
gcc -shared -ldl -fPIC pthread_interpose.c -o libmypthread.so
你可以将它用于任何动态链接的编程:
LD_PRELOAD=/path/to/libmypthread.so someprog
注意:这是此blog post
的附加版本答案 1 :(得分:2)
pthreads API中没有用于检索线程列表的标准方法。您可以做的是深入了解“ps”或“top”的源代码,看看它是如何完成的。您可以在procps library。
中找到源代码答案 2 :(得分:0)
阅读/ proc / [your-process-pid] / task
中的文件夹列表这是一个目录,其中包含进程中每个线程的一个子目录。