Newsgroup: it.comp.lang.c++
Titolo: Modificare una funzione senza killare il processo

Salve a tutti,
     vi propongo una questione che ho trovato curiosa, non di facile risoluzione nemmeno girando su internet (probabilmente perché non conosco la keyword giusta). 
 
Allora, supponiamo che io abbia un programma che fa uso di una funzione fun(). 
 
Nel momento in cui io lancio il programma, questo esegue la funzione ogni volta che viene chiamata. 
 
La domanda è: *durante l'esecuzione del programma* come posso modificare la funzione fun() *dall'esterno*, e senza killare il processo? 
 
Esempio:
 
supponiamo che la funzione fun() sia
 
void fun(){cout<<"hello"<<endl;}
 
ad un certo punto, voglio modificare questa funzione, e decidere che stampi "salut" invece che "hello". 
 
Una soluzione sarebbe quella di killare il processo, cambiare il sorgente, ricompilare, e rilanciare il tutto. 
 
C'è la possibilità di farlo on the fly, cioè mentre il processo gira (ovviamente avendo tutti i diritti di amministratore, etc...)?
 
Qualsiasi hint è ben accetto (keyword, links, o altri gruppi se sono OT :) )
 
Grazie a tutti,
       G.

 Salve a tutti,
 
 
Vado a sentimento.
- metterei la funzione in una libreria ad aggancio dinamico,
- caricherei il suo handler con dlopen
- nel programma, definirei un gestore di un segnale utente che fa il 
reload della libreria e sovrascrive l'handler.
 
Quando modifichi la funzione, la ricompili, crei la libreria, lanci il 
segnale al programma.
 
Sorge però un dubbio: bisogna controllare se il sistema si fida e carica 
la libreria da disco, o utilizza la versione che ha già in memoria.
 
Riccardo
 
 

 
 
con dlclose(o equivalenti) + cambio di versione/revisione il sistema *deve* caricare quella nuova ;) Se così non fosse per qualche strano motivo interno basta cambiare ogni volta il nome della libreria e segnalare (tramite file/shmem/socket) il nome della nuova.
 
Ciao!

 con dlclose(o equivalenti) + cambio di versione/revisione il sistema *deve* caricare quella nuova ;) Se così non fosse per qualche strano motivo interno basta cambiare ogni volta il nome della libreria e segnalare (tramite file/shmem/socket) il nome della nuova.
 
Nella libreria standard del C++ non ci sono le funzioni "dlopen", 
"dlclose", "file", "shmem", "socket". Probabilmente fanno parte dell'API 
di qualche libreria o sistema operativo.
D'altra parte lo standard C++ non prevede il caricamento dinamico di 
funzioni.
 
In ambiente Microsoft Windows, io metterei la funzione in una DLL, che 
deve essere caricata chiamando la funzione "LoadLibrary" e scaricata 
chiamando la funzione "FreeLibrary".
Non è possibile modificare una DLL che è ancora caricata da qualche 
processo; quindi, prima di modificarla, devi assicurarti che tutti i 
processi che l'avevano caricata l'abbiano gia' scaricata.
 
-- 
 
Carlo Milanesi
http://carlomilanesi.wordpress.com/
 


dlopen()/dlclose() sono i rispettivi *nix di LoadLibrary()/FreeLibrary().
Ciao!

         G.
 
La domanda e' : vuoi modificare il codice della funzione in esecuzione
o semplicemente alcuni dei suoi parametri(nel tuo esempio la
stringa che stampa)?
I due comportamenti sono ben diversi :-)
Per il secondo, non si modifica il codice, ma solo dei comportamenti
predefiniti: per questo ci sono N sistemi per passare dati/parametri
comandi... dall' uso di shrared ram a IPC di varia natura.
Nel primo caso invece vorresti cambiare dinamicamente anche
il codice ed il comportamento dell' applicazione in toto.
Il linguaggio non mi pare preveda vie per fare questo 'nativamente'
per cui la cosa e' fortemente system-dependent, magari usando
DLL da caricare/scaricare a run-time su evento da definire.
 
cc.

A quale scopo vorresti fare ciň ?
 

 [...]
 
 
Ciao  Manlio

 la libreria da disco, 
 
LoL mi piace questa cosa che il sistema "si fida" e "ci casca" ..