2010-09-14 3 views

Répondre

7

Une façon de le faire est de créer une fonction de remplacement pour pthread_create et d'utiliser LD_PRELOAD. Bien sûr, vous ne voulez pas réimplémentez pthread_create, donc vous devez pthread_create en quelque sorte, mais vous pouvez demander au chargeur dynamique pour le charger pour vous:

#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; 
} 

Ensuite, vous compilez à une bibliothèque partagée:

gcc -shared -ldl -fPIC pthread_interpose.c -o libmypthread.so 

Et vous pouvez l'utiliser avec un prog lié dynamiquement:

LD_PRELOAD=/path/to/libmypthread.so someprog 

note: Ceci est une version adpated de cette blog post

2

Il n'existe aucun moyen standard dans l'API pthreads pour récupérer la liste des threads. Ce que vous pouvez faire est de plonger dans le code source de "ps" ou "top" et voir comment c'est fait. Vous pouvez trouver le code source dans le procps library.

0

Lire la liste des dossiers dans/proc/[votre-processus pid]/tâche

Ceci est un répertoire qui contient un sous-répertoire pour chaque thread dans le processus.

Questions connexes