получить все thread_id, созданные с помощью pthread_created внутри процесса - PullRequest
6 голосов
/ 14 сентября 2010

Использование pthreads, если есть какой-либо "интеллектуальный" способ получить все threadID s, созданные с помощью pthread_created внутри процесса, предполагая, что эти потоки созданы в сторонней библиотеке, которая не предоставляет эти данные.

Ответы [ 3 ]

7 голосов
/ 14 сентября 2010

Один из способов сделать это - создать функцию замены для 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

Примечание: Это версия этого * блога

2 голосов
/ 14 сентября 2010

В API pthreads нет стандартного способа получения списка потоков.Что вы можете сделать, так это окунуться в исходный код «ps» или «top» и посмотреть, как это делается.Вы можете найти исходный код в библиотеке procps .

0 голосов
/ 14 сентября 2010

Прочтите список папок в / proc / [your-process-pid] / task

Это каталог, который содержит один подкаталог для каждого потока в процессе.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...