LimiT-MaTz
23-07-2006, 21:13
Ho un problema per quanto riguarda l'handling dei segnali.
Sto sviluppando una piccola applicazione (mi serve fondamentalmente per esercizio).
ho intenzione di fare un handler per il segnale SIGTSTP.
fondamentalmente vorrei ottenere questo in caso di ctrl+z l'applicazione deve morire e prima di morire deve liberare un struttura dati.
la struttura dati e' una semplice lista doppiolinkata definita nella lib standard.
il tutto viene istanziato nel main
list<process> * List_proc = new list<process>();
essendo instaziata nel main quando vado a "costruire la funzione richiamata dall'handle dei signal" non posso fare accesso in alcun modo alla struttura (non posso passarla per parametro).
Una soluzione potrebbe essere quella di dichiarare List_proc globale cio' risolverebbe i miei problemi. Non voglio seguire questa via ma provare un'altra via.
L'idea e' questa:
fare un handle banale che chiami exit(OK) e andare a definire la funzione da chiamare all'uscita:
-- Function: int on_exit (void (*FUNCTION)(int STATUS, void *ARG),void *ARG)
ho quindi creato una funzione "Delete_list" che si occupi di chiamare il delete in caso il puntatore *ARG esista.
void Delete_list(int n,void *lst)
{
if(lst)
{
cout<<"DELETE"<<endl;
delete (list<process> *) lst;
}
}
e l'ho registrata nel main:
on_exit(Delete_list,List_proc); /* Operation to do at exit */
ora ho provato un po il programma e gira senza errore, al segnale ctrl-z si chiude senza dare errori.
Per verificare se la heap viene liberata veramente ho fatto un test con valgrind e mi sono accorto che cio' non accade
==28163==
==28163== ERROR SUMMARY: 0 errors from 0 contexts (suppressed: 19 from 1)
==28163== malloc/free: in use at exit: 5,795 bytes in 143 blocks.
==28163== malloc/free: 1,152 allocs, 1,009 frees, 1,888,613 bytes allocated.
==28163== For counts of detected errors, rerun with: -v
==28163== searching for pointers to 143 not-freed blocks.
==28163== checked 116,208 bytes.
==28163==
==28163== LEAK SUMMARY:
==28163== definitely lost: 0 bytes in 0 blocks.
==28163== possibly lost: 1,527 bytes in 71 blocks.
==28163== still reachable: 4,268 bytes in 72 blocks.
==28163== suppressed: 0 bytes in 0 blocks.
==28163== Reachable blocks (those to which a pointer was found) are not shown.
il problema avviene solo esclusivamente quando chiamo exit(OK) ovvero quando "premo ctrl-z".
sapreste aiutarmi?
Grazie.
Sto sviluppando una piccola applicazione (mi serve fondamentalmente per esercizio).
ho intenzione di fare un handler per il segnale SIGTSTP.
fondamentalmente vorrei ottenere questo in caso di ctrl+z l'applicazione deve morire e prima di morire deve liberare un struttura dati.
la struttura dati e' una semplice lista doppiolinkata definita nella lib standard.
il tutto viene istanziato nel main
list<process> * List_proc = new list<process>();
essendo instaziata nel main quando vado a "costruire la funzione richiamata dall'handle dei signal" non posso fare accesso in alcun modo alla struttura (non posso passarla per parametro).
Una soluzione potrebbe essere quella di dichiarare List_proc globale cio' risolverebbe i miei problemi. Non voglio seguire questa via ma provare un'altra via.
L'idea e' questa:
fare un handle banale che chiami exit(OK) e andare a definire la funzione da chiamare all'uscita:
-- Function: int on_exit (void (*FUNCTION)(int STATUS, void *ARG),void *ARG)
ho quindi creato una funzione "Delete_list" che si occupi di chiamare il delete in caso il puntatore *ARG esista.
void Delete_list(int n,void *lst)
{
if(lst)
{
cout<<"DELETE"<<endl;
delete (list<process> *) lst;
}
}
e l'ho registrata nel main:
on_exit(Delete_list,List_proc); /* Operation to do at exit */
ora ho provato un po il programma e gira senza errore, al segnale ctrl-z si chiude senza dare errori.
Per verificare se la heap viene liberata veramente ho fatto un test con valgrind e mi sono accorto che cio' non accade
==28163==
==28163== ERROR SUMMARY: 0 errors from 0 contexts (suppressed: 19 from 1)
==28163== malloc/free: in use at exit: 5,795 bytes in 143 blocks.
==28163== malloc/free: 1,152 allocs, 1,009 frees, 1,888,613 bytes allocated.
==28163== For counts of detected errors, rerun with: -v
==28163== searching for pointers to 143 not-freed blocks.
==28163== checked 116,208 bytes.
==28163==
==28163== LEAK SUMMARY:
==28163== definitely lost: 0 bytes in 0 blocks.
==28163== possibly lost: 1,527 bytes in 71 blocks.
==28163== still reachable: 4,268 bytes in 72 blocks.
==28163== suppressed: 0 bytes in 0 blocks.
==28163== Reachable blocks (those to which a pointer was found) are not shown.
il problema avviene solo esclusivamente quando chiamo exit(OK) ovvero quando "premo ctrl-z".
sapreste aiutarmi?
Grazie.