【发布时间】:2018-03-10 23:46:26
【问题描述】:
我拦截了pthread_create 调用来捕获所有线程之间的关系。但是我发现有些线程的创建没有记录,只拦截pthread_create。我还试图拦截posix_spawnposix_spawnp和clone的通话。但是在我的实验中仍然有一些我不知道是谁创建它们的线程。那么还有没有其他方法可以在linux上创建线程呢?
更具体地说,
我使用LD_PRELOAD拦截pthread_create调用,代码片段如下:
int pthread_create(pthread_t *thread, const pthread_attr_t *attr, void *(*start_routine)(void *), void *arg){
static void *handle = NULL;
static P_CREATE old_create=NULL;
if( !handle )
{
handle = dlopen("libpthread.so.0", RTLD_LAZY);
old_create = (P_CREATE)dlsym(handle, "pthread_create");
}
pthread_t tmp=pthread_self();
//print pthread_t pid
int result=old_create(thread,attr,start_routine,(void *)temp);
//print thread pid
return result;
}
这样,我捕获了所有线程创建过程。 clone 也是如此。但实际上clone 并没有被应用程序调用。有时,我得到一个父子线程对,之前没有打印父线程。所以不知道有没有其他方法可以创建这个父线程。
更具体地说,上层应用程序是JVM1.7 上的Mapreduce 作业。我想观察所有线程和进程及其关系
谢谢。
【问题讨论】:
-
您是否正在考虑内部内核线程?因为否则 all 用户空间线程(和进程)的创建通过 Linux 中的
clone调用。 -
@Someprogrammerdude:即使在今天,您也可以使用真正的
fork和vfork系统调用来创建进程。如果libc为它们使用clone(2)系统调用,则其他一些代码(例如汇编代码,或与旧libc 静态链接的二进制文件)可以直接使用fork和vfork而无需clone -
@BasileStarynkevitch 好的,我告诉你,人们总是可以直接调用老式的系统调用,但是理智的人会这样做吗? :)
-
任何运行足够老的 Linux 可执行二进制文件的人都会使用
fork系统调用;例如我 15 年前编译并保持完整的一些 ELF 静态链接可执行文件
标签: c linux multithreading pthreads system-calls