You are not logged in.
Je travaille sur des 'continuations' en C (voir call/cc SHEME)
et je voudrais rendre ces fonctions disponibles par défaut
dans les appels de socket (accept, read, write) qui bloquent.
Cela permet de rendre ces appels bloquants asynchrones
TOUT EN programmant de manière procédurale (pas de
state-machine pour traiter les évênements, comme avec
les appels non-bloquants).
Pour que cela marche avec le code existant (librairies de
protocoles réseau, ou interfaces SQL, etc.) il faut que je
puisse encapsuler ou intercepter les appels de socket pour
gérer les "continuations" de manière transparente.
J'ai entendu parler de #undef et #define pour "overloader"
les fonctions mais je suis débutant sous Linux.
Savez-vous comment faire? Toute suggestion est bienvenue!
Pierre.
Offline
Tu peux surcharger n'importe quelles fonctions non-static via LD_PRELOAD (voir ton moteur de recherche favori) et passer par dlopen pour chopper les vrais fonctions.
Offline
Salut,
Je ne comprends pas la question. Dans un code source C/C++ il peut y avoir des lignes qui commencent par le #. Ce sont des instructions de "précompillation".
Par exemple si dans un fichier il y a cette ligne :
#define AIRE_DU_CERCLE(x) (3.14 * ( x ) * ( x ))
alors lors de la phase de précompilation le texte "aire = AIRE_DU_CERCLE(2);" est remplacée par "aire = (3.14 * ( 2 ) * ( 2 ));"
Pour enlever cette directive il es possible d'utiliser la directive #undef...
Plus d'explications ici : http://www2.ift.ulaval.ca/~dupuis/Progr … lation.pdf
Meilleures salutations.
PS : autre exemple piqué ici http://homepage.mac.com/pierremousel/La … eProc.html
#define pi 3.1415926536 circonference = 2 * pi * rayon; #undef pi #define pi "3.1415" printf ("pi vaut %s", pi);
Last edited by jean@adimp.ch (03 Nov 2010 23:07:56)
Offline
En fait tu peux aussi "surcharger" avec un #define :-) mais c'est au niveau de la compilation et non en runtime. Il arrive que c'est utile de faire des hooks du point de vue des sources.
Par exemple tu as une bibliothèque qui te donne accès à la fonction void foobar(int a) et tu l'utilises dans un gros programme à beaucoup d'endroits. Pour différentes raisons tu ne veux pas faire du hack dans tous les coins, alors tu fais :
#undef foobar #define foobar my_foobar
pour que ca appel bien ta fonction et non l'original (je le fais d'ailleurs ces jours-ci dans un projet très particulier).
Mais cette façon de faire peu avoir des effets de bords selon l'endroit où est utilisé le mot "foobar". Alors faut faire attention avec ça.
Mieux:
#undef foobar #define foobar(a) my_foobar(a)
le premier exemple je l'utilise en réalité avec des noms de classes (dans mon projet spécial). Si c'est une fonction alors en passant par un paramètre c'est bcp plus sûr.
Offline