PDA

View Full Version : [ C ] info cattura segnali


finalint
16-03-2007, 11:20
ciao, non mi è molto chiaro un aspetto sulla gestione dei segnali..
mi potete dare una mano!?

usando un costrutto del genere posso catturare un segnale e
eseguire una funzione di "gestione" del segnale che ho catturato..

#include <signal.h>
...
void gestoreKill()
{
//eseguita quando viene ricevuto un kill
signal(SIGKILL, gestoreKill);
...
}
...
int main()
{
//Inizializza l'azione assegnata al segnale SIGKILL
signal(SIGKILL, gestoreKill);
...
}



però non ho dove devo andare per trovare il codice esatto dell'errore..
questi:

249 /* codes for SIGSEGV */
250 #define SEGV_MAPERR 1 /* Address not mapped to object. */
251 #define SEGV_ACCERR 2 /* Invalid permissions for mapped */
252 /* object. */
253
254 /* codes for SIGFPE */
255 #define FPE_INTOVF 1 /* Integer overflow. */
256 #define FPE_INTDIV 2 /* Integer divide by zero. */
257 #define FPE_FLTDIV 3 /* Floating point divide by zero. */
258 #define FPE_FLTOVF 4 /* Floating point overflow. */
259 #define FPE_FLTUND 5 /* Floating point underflow. */
260 #define FPE_FLTRES 6 /* Floating point inexact result. */
261 #define FPE_FLTINV 7 /* Invalid floating point operation. */
262 #define FPE_FLTSUB 8 /* Subscript out of range. */
263
264 /* codes for SIGTRAP */
265 #define TRAP_BRKPT 1 /* Process breakpoint. */
266 #define TRAP_TRACE 2 /* Process trace trap.



se io catturo SIGTRAP come faccio a capire se è TRAP_BRKPT o TRAP_TRACE?!

ilsensine
16-03-2007, 11:29
Forse vuoi dare una occhiata alla più completa "sigaction".

nb SIGKILL non è intercettabile.

finalint
16-03-2007, 11:48
vado a dare un occhiata alla sigaction....

----

quello che mi interessa fare è ad esempio questo...

signal(SIGFPE, gestore);

come faccio a capire quale caso si è verificato fra questi!?

254 /* codes for SIGFPE */
255 #define FPE_INTOVF 1 /* Integer overflow. */
256 #define FPE_INTDIV 2 /* Integer divide by zero. */
257 #define FPE_FLTDIV 3 /* Floating point divide by zero. */
258 #define FPE_FLTOVF 4 /* Floating point overflow. */
259 #define FPE_FLTUND 5 /* Floating point underflow. */
260 #define FPE_FLTRES 6 /* Floating point inexact result. */
261 #define FPE_FLTINV 7 /* Invalid floating point operation. */
262 #define FPE_FLTSUB 8 /* Subscript out of range. */


ps per la sigkill non ci avevo fatto caso.. avevo fatto un copia incolla...

ilsensine
16-03-2007, 12:18
Non puoi. "signal" offre una interfaccia molto semplice. sigaction ti consente di registrare un handler cui vengono passati anche altri parametri, tra cui un siginfo_t che contiene varie informazioni (tra cui probabilmente quella che cerchi). L'utilizzo è semplice:



void sighandler(int sig, siginfo_t *siginfo, void *data)
{
// il tuo signal handler
}

int main()
{
struct sigaction act;

act.sa_flags = SA_SIGINFO;
act.sa_sigaction = sighandler;
sigemptyset(&act.sa_mask);

sigaction(SIGSEGV, &act, NULL);
...
}



La struttura di siginfo_t la trovi nella manpage di sigaction. Non ho mai provato, ma credo che sia sa_code l'informazione che cerchi.