|
|
|
|
Strumenti |
03-09-2009, 16:40 | #1 |
Senior Member
Iscritto dal: Jul 2002
Messaggi: 869
|
[C] Signal handler (per esperti)
Salve ragazzi.
Ho un nuovo grattacapo che mi sta facendo perdere parecchio tempo e spero che qualcuno di voi, esperto nella gestione dei segnali, possa darmi una mano. Allora. Il problema è semplice. Ho un codice scritto in C che dopo un'ora di computazione deve essere terminato. Poichè però sarei interessato a farmi stampare le info che ha calcolato in quell'ora ho pensato di usare i segnali per poter gestire la cosa. Codice:
getrlimit(RLIMIT_CPU, &limitbuf); limitbuf.rlim_cur = 3604; limitbuf.rlim_max = 3700; setrlimit(RLIMIT_CPU, &limitbuf); if( signal(SIGXCPU,GestoreKill)==SIG_ERR ){ printf("errore di ritorno della signal (SIGXCPU). \n"); exit(0); } La cosa ha funzionato per un bel po ma "ultimamente" (hanno cambiato qualcosa nelle ultime versioni di linux?) mi sta dando problemi. In pratica il processo va in deadlock dopo aver chiamato la funzione GestoreKill. (Tramite ps ho scoperto che il processo va in sleep perchè in attesa "futex qualcosa...") Leggendo su internet ho scoperto che nei signal handler si possono usare solo particolari funzioni e vanno assolutamente evitate printf, malloc e altre. Le malloc infatti erano una delle cause del deadlock ma anche la exit. Quest'ultima infatti prima di terminare il processo esegue una serie di operazioni che si bloccavano probabilmente perchè cercano di accedere a risorse lockate dal processo principale (l'ho rimpiazzata con la _exit). Quindi vi chiedo: 1. Poichè il processo principale deve morire c'è un modo per "sbloccare" tutte le sue risorse in modo che in signal handler possa fare quello che vuole senza andare in deadlock? 2. Esistono funzioni alternative e "sicure" da usare nel signal handler per farsi stampare le informazioni? 3. Esistono approcci alternativi al problema che non usano i segnali? 4. Mi potreste consigliare qualche libro/guida/tutorial che descrive approfonditamente la gestione dei segnali con tutte le magagne che li accompagnano? Grazie per l'aiuto.
__________________
Notebook: MBP 15 i7 Retina, (Mid 2014) |
03-09-2009, 20:30 | #2 |
Senior Member
Iscritto dal: Dec 2001
Messaggi: 700
|
rispondo al punto 2:
puoi usare questa funzione per stampare a video nell'handler di un segnale: Codice:
static void safePrint(const char *str) { int length = strlen(str); write(STDOUT_FILENO, str, length); }
__________________
Le mie app per iphone: Wow Minis Match Tracker ||| Wow Minis Hit Calculator (in review ) Frieza#916 @ SC2 ||| Giullo @ Steam Ultima modifica di Giullo : 03-09-2009 alle 20:33. |
03-09-2009, 21:01 | #3 | |
Senior Member
Iscritto dal: Jul 2002
Messaggi: 869
|
Quote:
Non avendo trovato una risposta alle domande 1 e 3 l'unico modo che ho di risolvere il problema è fare il meno possibile nell'handler usando funzioni sicure.
__________________
Notebook: MBP 15 i7 Retina, (Mid 2014) |
|
04-09-2009, 08:47 | #4 |
Senior Member
Iscritto dal: Dec 2001
Messaggi: 700
|
stai stampando sullo standard output con STDOUT_FILENO, non capisco il riferimento al file
__________________
Le mie app per iphone: Wow Minis Match Tracker ||| Wow Minis Hit Calculator (in review ) Frieza#916 @ SC2 ||| Giullo @ Steam |
04-09-2009, 13:33 | #5 |
Senior Member
Iscritto dal: Jul 2002
Messaggi: 869
|
Il programma viene invocato centinaia di volte all'interno di uno script bash che redirezione l'output su di un file. Teoricamente usare la write nel codice non dovrebbe cambiare nulla dato che alla fine sempre sulla standard output scrive.
__________________
Notebook: MBP 15 i7 Retina, (Mid 2014) |
Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 13:08.